connection_manager.cc revision 4348879380222dc8c74b0976e527bf3da66ba08f
14348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
2d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes// Use of this source code is governed by a BSD-style license that can be
3d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes// found in the LICENSE file.
4d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
54348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan#include "update_engine/connection_manager.h"
6d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
7d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes#include <string>
8d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
94348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan#include <base/stl_util.h>
10d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes#include <base/string_util.h>
114348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan#include <chromeos/dbus/service_constants.h>
12d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes#include <dbus/dbus-glib.h>
13d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes#include <glib.h>
14d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
154348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan#include "update_engine/system_state.h"
16d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes#include "update_engine/utils.h"
17d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
184348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasanusing std::set;
19d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyesusing std::string;
20d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
21d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyesnamespace chromeos_update_engine {
22d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
23d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyesnamespace {
24d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
25d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes// Gets the DbusGProxy for FlimFlam. Must be free'd with ProxyUnref()
26d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyesbool GetFlimFlamProxy(DbusGlibInterface* dbus_iface,
27d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                      const char* path,
28d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                      const char* interface,
29d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                      DBusGProxy** out_proxy) {
30d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  DBusGConnection* bus;
31d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  DBusGProxy* proxy;
32d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  GError* error = NULL;
33d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
34d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  bus = dbus_iface->BusGet(DBUS_BUS_SYSTEM, &error);
35d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  if (!bus) {
36d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes    LOG(ERROR) << "Failed to get system bus";
37d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes    return false;
38d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  }
39d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  proxy = dbus_iface->ProxyNewForNameOwner(bus,
404348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                                           flimflam::kFlimflamServiceName,
41d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                                           path,
42d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                                           interface,
43d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                                           &error);
44d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  if (!proxy) {
45d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes    LOG(ERROR) << "Error getting FlimFlam proxy: "
46a0b9e777e2c571546bd6ab55356acb023834cbc3Darin Petkov               << utils::GetAndFreeGError(&error);
47d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes    return false;
48d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  }
49d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  *out_proxy = proxy;
50d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  return true;
51d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes}
52d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
53d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes// On success, caller owns the GHashTable at out_hash_table.
54d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes// Returns true on success.
55d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyesbool GetProperties(DbusGlibInterface* dbus_iface,
56d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                   const char* path,
57d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                   const char* interface,
58d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                   GHashTable** out_hash_table) {
59d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  DBusGProxy* proxy;
60d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  GError* error = NULL;
61d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
62d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  TEST_AND_RETURN_FALSE(GetFlimFlamProxy(dbus_iface,
63d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                                         path,
64d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                                         interface,
65d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                                         &proxy));
66d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
67d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  gboolean rc = dbus_iface->ProxyCall(proxy,
68d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                                      "GetProperties",
69d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                                      &error,
70d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                                      G_TYPE_INVALID,
71d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                                      dbus_g_type_get_map("GHashTable",
72d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                                                          G_TYPE_STRING,
73d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                                                          G_TYPE_VALUE),
74d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                                      out_hash_table,
75d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                                      G_TYPE_INVALID);
76d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  dbus_iface->ProxyUnref(proxy);
77d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  if (rc == FALSE) {
78d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes    LOG(ERROR) << "dbus_g_proxy_call failed";
79d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes    return false;
80d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  }
81d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
82d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  return true;
83d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes}
84d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
85d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes// Returns (via out_path) the default network path, or empty string if
86d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes// there's no network up.
87d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes// Returns true on success.
88d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyesbool GetDefaultServicePath(DbusGlibInterface* dbus_iface, string* out_path) {
89d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  GHashTable* hash_table = NULL;
90d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
91d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  TEST_AND_RETURN_FALSE(GetProperties(dbus_iface,
924348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                                      flimflam::kFlimflamServicePath,
934348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                                      flimflam::kFlimflamManagerInterface,
94d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                                      &hash_table));
95d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
96d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  GValue* value = reinterpret_cast<GValue*>(g_hash_table_lookup(hash_table,
97d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                                                                "Services"));
98d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  GArray* array = NULL;
99d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  bool success = false;
10088226ff9674d5d6250a0c919082e9bd1c93c35bfmukesh agrawal  if (G_VALUE_HOLDS(value, DBUS_TYPE_G_OBJECT_PATH_ARRAY) &&
101d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes      (array = reinterpret_cast<GArray*>(g_value_get_boxed(value))) &&
102d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes      (array->len > 0)) {
103d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes    *out_path = g_array_index(array, const char*, 0);
104d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes    success = true;
105d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  }
10688226ff9674d5d6250a0c919082e9bd1c93c35bfmukesh agrawal
107d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  g_hash_table_unref(hash_table);
108d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  return success;
109d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes}
110d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
111d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los ReyesNetworkConnectionType ParseConnectionType(const char* type_str) {
1124348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  if (!strcmp(type_str, flimflam::kTypeEthernet)) {
113d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes    return kNetEthernet;
1144348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  } else if (!strcmp(type_str, flimflam::kTypeWifi)) {
115d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes    return kNetWifi;
1164348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  } else if (!strcmp(type_str, flimflam::kTypeWimax)) {
117d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes    return kNetWimax;
1184348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  } else if (!strcmp(type_str, flimflam::kTypeBluetooth)) {
119d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes    return kNetBluetooth;
1204348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  } else if (!strcmp(type_str, flimflam::kTypeCellular)) {
121d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes    return kNetCellular;
122d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  }
123d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  return kNetUnknown;
124d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes}
125d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
126d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyesbool GetServicePathType(DbusGlibInterface* dbus_iface,
127d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                        const string& path,
128d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                        NetworkConnectionType* out_type) {
129d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  GHashTable* hash_table = NULL;
130d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
131d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  TEST_AND_RETURN_FALSE(GetProperties(dbus_iface,
132d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                                      path.c_str(),
1334348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                                      flimflam::kFlimflamServiceInterface,
134d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                                      &hash_table));
135d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
136d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  GValue* value = (GValue*)g_hash_table_lookup(hash_table, "Type");
137d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  const char* type_str = NULL;
138d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  bool success = false;
139d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  if (value != NULL && (type_str = g_value_get_string(value)) != NULL) {
140d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes    *out_type = ParseConnectionType(type_str);
141d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes    success = true;
142d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  }
143d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  g_hash_table_unref(hash_table);
144d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  return success;
145d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes}
146d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
147d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes}  // namespace {}
148d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
1494348879380222dc8c74b0976e527bf3da66ba08fJay SrinivasanConnectionManager::ConnectionManager(SystemState *system_state)
1504348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan    :  system_state_(system_state) {}
1514348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
1524348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasanbool ConnectionManager::IsUpdateAllowedOver(NetworkConnectionType type) const {
1534348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  switch (type) {
1544348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan    case kNetBluetooth:
1554348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      return false;
1564348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
1574348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan    case kNetCellular: {
1584348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      set<string> allowed_types;
1594348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      const policy::DevicePolicy* device_policy =
1604348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan          system_state_->GetDevicePolicy();
1614348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      if (!device_policy) {
1624348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan        LOG(INFO) << "Disabling updates over cellular connection as there's no "
1634348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                     "device policy object present";
1644348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan        return false;
1654348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      }
1664348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
1674348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      if (!device_policy->GetAllowedConnectionTypesForUpdate(&allowed_types)) {
1684348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan        LOG(INFO) << "Disabling updates over cellular connection as there's no "
1694348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                     "allowed connection types from policy";
1704348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan        return false;
1714348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      }
1724348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
1734348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      if (!ContainsKey(allowed_types, flimflam::kTypeCellular)) {
1744348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan        LOG(INFO) << "Disabling updates over cellular connection as it's not "
1754348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                     "allowed in the device policy.";
1764348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan        return false;
1774348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      }
1784348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
1794348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      LOG(INFO) << "Allowing updates over cellular per device policy";
1804348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      return true;
1814348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan    }
1824348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
1834348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan    default:
1844348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      return true;
1854348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  }
1864348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan}
1874348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
1884348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasanconst char* ConnectionManager::StringForConnectionType(
1894348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan    NetworkConnectionType type) const {
1904348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  static const char* const kValues[] = {flimflam::kTypeEthernet,
1914348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                                        flimflam::kTypeWifi,
1924348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                                        flimflam::kTypeWimax,
1934348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                                        flimflam::kTypeBluetooth,
1944348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                                        flimflam::kTypeCellular};
195d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  if (type < 0 || type >= static_cast<int>(arraysize(kValues))) {
196d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes    return "Unknown";
197d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  }
198d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  return kValues[type];
199d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes}
200d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
2014348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasanbool ConnectionManager::GetConnectionType(
2024348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan    DbusGlibInterface* dbus_iface,
2034348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan    NetworkConnectionType* out_type) const {
204d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  string default_service_path;
205d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  TEST_AND_RETURN_FALSE(GetDefaultServicePath(dbus_iface,
206d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                                              &default_service_path));
207d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  TEST_AND_RETURN_FALSE(GetServicePathType(dbus_iface,
208d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                                           default_service_path,
209d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                                           out_type));
210d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  return true;
211d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes}
212d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
213d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes}  // namespace chromeos_update_engine
214