connection_manager.cc revision 305345001d85ca2282112c2a30fe75c7a4773491
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
7d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko#include <set>
8d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes#include <string>
9d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
104348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan#include <base/stl_util.h>
1175039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko#include <base/strings/string_util.h>
124348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan#include <chromeos/dbus/service_constants.h>
13d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes#include <glib.h>
141f84723f499b3b309efac11324ed4e6c937341b6Gilad Arnold#include <policy/device_policy.h>
15d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
16f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo#include "update_engine/prefs.h"
174348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan#include "update_engine/system_state.h"
18d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes#include "update_engine/utils.h"
19d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
20305345001d85ca2282112c2a30fe75c7a4773491Alex Deymousing org::chromium::flimflam::ManagerProxyInterface;
21305345001d85ca2282112c2a30fe75c7a4773491Alex Deymousing org::chromium::flimflam::ServiceProxyInterface;
224348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasanusing std::set;
23d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyesusing std::string;
24d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
25d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyesnamespace chromeos_update_engine {
26d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
27d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyesnamespace {
28d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
29305345001d85ca2282112c2a30fe75c7a4773491Alex DeymoNetworkConnectionType ParseConnectionType(const string& type_str) {
30305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo  if (type_str == shill::kTypeEthernet) {
3175eac7e523f825afdb88508922d7dc65fa366b19Alex Deymo    return NetworkConnectionType::kEthernet;
32305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo  } else if (type_str == shill::kTypeWifi) {
3375eac7e523f825afdb88508922d7dc65fa366b19Alex Deymo    return NetworkConnectionType::kWifi;
34305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo  } else if (type_str == shill::kTypeWimax) {
3575eac7e523f825afdb88508922d7dc65fa366b19Alex Deymo    return NetworkConnectionType::kWimax;
36305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo  } else if (type_str == shill::kTypeBluetooth) {
3775eac7e523f825afdb88508922d7dc65fa366b19Alex Deymo    return NetworkConnectionType::kBluetooth;
38305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo  } else if (type_str == shill::kTypeCellular) {
3975eac7e523f825afdb88508922d7dc65fa366b19Alex Deymo    return NetworkConnectionType::kCellular;
40d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  }
4175eac7e523f825afdb88508922d7dc65fa366b19Alex Deymo  return NetworkConnectionType::kUnknown;
42d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes}
43d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
44305345001d85ca2282112c2a30fe75c7a4773491Alex DeymoNetworkTethering ParseTethering(const string& tethering_str) {
45305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo  if (tethering_str == shill::kTetheringNotDetectedState) {
466ae9120dc76ce9a3c8d05f71c05f23e3f4bdc6bdAlex Deymo    return NetworkTethering::kNotDetected;
47305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo  } else if (tethering_str == shill::kTetheringSuspectedState) {
486ae9120dc76ce9a3c8d05f71c05f23e3f4bdc6bdAlex Deymo    return NetworkTethering::kSuspected;
49305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo  } else if (tethering_str == shill::kTetheringConfirmedState) {
506ae9120dc76ce9a3c8d05f71c05f23e3f4bdc6bdAlex Deymo    return NetworkTethering::kConfirmed;
516ae9120dc76ce9a3c8d05f71c05f23e3f4bdc6bdAlex Deymo  }
526ae9120dc76ce9a3c8d05f71c05f23e3f4bdc6bdAlex Deymo  LOG(WARNING) << "Unknown Tethering value: " << tethering_str;
536ae9120dc76ce9a3c8d05f71c05f23e3f4bdc6bdAlex Deymo  return NetworkTethering::kUnknown;
546ae9120dc76ce9a3c8d05f71c05f23e3f4bdc6bdAlex Deymo}
556ae9120dc76ce9a3c8d05f71c05f23e3f4bdc6bdAlex Deymo
56d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko}  // namespace
57d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
58305345001d85ca2282112c2a30fe75c7a4773491Alex DeymoConnectionManager::ConnectionManager(ShillProxyInterface* shill_proxy,
59305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo                                     SystemState* system_state)
60305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo    : shill_proxy_(shill_proxy), system_state_(system_state) {}
614348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
626ae9120dc76ce9a3c8d05f71c05f23e3f4bdc6bdAlex Deymobool ConnectionManager::IsUpdateAllowedOver(NetworkConnectionType type,
636ae9120dc76ce9a3c8d05f71c05f23e3f4bdc6bdAlex Deymo                                            NetworkTethering tethering) const {
644348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  switch (type) {
6575eac7e523f825afdb88508922d7dc65fa366b19Alex Deymo    case NetworkConnectionType::kBluetooth:
664348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      return false;
674348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
6875eac7e523f825afdb88508922d7dc65fa366b19Alex Deymo    case NetworkConnectionType::kCellular: {
694348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      set<string> allowed_types;
704348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      const policy::DevicePolicy* device_policy =
716f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan          system_state_->device_policy();
72f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo
73f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo      // A device_policy is loaded in a lazy way right before an update check,
74f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo      // so the device_policy should be already loaded at this point. If it's
75f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo      // not, return a safe value for this setting.
764348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      if (!device_policy) {
77f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo        LOG(INFO) << "Disabling updates over cellular networks as there's no "
78f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo                     "device policy loaded yet.";
794348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan        return false;
804348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      }
814348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
82f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo      if (device_policy->GetAllowedConnectionTypesForUpdate(&allowed_types)) {
83f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo        // The update setting is enforced by the device policy.
84f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo
859a423ff19e3a7503cd8128998b3a10d65c499fdcGilad Arnold        if (!ContainsKey(allowed_types, shill::kTypeCellular)) {
86f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo          LOG(INFO) << "Disabling updates over cellular connection as it's not "
87f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo                       "allowed in the device policy.";
88f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo          return false;
89f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo        }
90f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo
91f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo        LOG(INFO) << "Allowing updates over cellular per device policy.";
92f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo        return true;
93f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo      } else {
94f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo        // There's no update setting in the device policy, using the local user
95f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo        // setting.
96f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo        PrefsInterface* prefs = system_state_->prefs();
97f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo
98f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo        if (!prefs || !prefs->Exists(kPrefsUpdateOverCellularPermission)) {
99f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo          LOG(INFO) << "Disabling updates over cellular connection as there's "
100f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo                       "no device policy setting nor user preference present.";
101f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo          return false;
102f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo        }
103f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo
104efb7c4c605440fdc6297deed8fa9d1aecb77235eAlex Deymo        bool stored_value;
105efb7c4c605440fdc6297deed8fa9d1aecb77235eAlex Deymo        if (!prefs->GetBoolean(kPrefsUpdateOverCellularPermission,
106efb7c4c605440fdc6297deed8fa9d1aecb77235eAlex Deymo                               &stored_value)) {
107f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo          return false;
108efb7c4c605440fdc6297deed8fa9d1aecb77235eAlex Deymo        }
109f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo
110f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo        if (!stored_value) {
111f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo          LOG(INFO) << "Disabling updates over cellular connection per user "
112f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo                       "setting.";
113f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo          return false;
114f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo        }
115f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo        LOG(INFO) << "Allowing updates over cellular per user setting.";
116f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo        return true;
1174348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      }
1184348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan    }
1194348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
1204348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan    default:
1216ae9120dc76ce9a3c8d05f71c05f23e3f4bdc6bdAlex Deymo      if (tethering == NetworkTethering::kConfirmed) {
1226ae9120dc76ce9a3c8d05f71c05f23e3f4bdc6bdAlex Deymo        // Treat this connection as if it is a cellular connection.
1236ae9120dc76ce9a3c8d05f71c05f23e3f4bdc6bdAlex Deymo        LOG(INFO) << "Current connection is confirmed tethered, using Cellular "
1246ae9120dc76ce9a3c8d05f71c05f23e3f4bdc6bdAlex Deymo                     "setting.";
12575eac7e523f825afdb88508922d7dc65fa366b19Alex Deymo        return IsUpdateAllowedOver(NetworkConnectionType::kCellular,
12675eac7e523f825afdb88508922d7dc65fa366b19Alex Deymo                                   NetworkTethering::kUnknown);
1276ae9120dc76ce9a3c8d05f71c05f23e3f4bdc6bdAlex Deymo      }
1284348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      return true;
1294348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  }
1304348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan}
1314348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
132f6ee0163504eaf1a7cc136ba2c075d77ae2b4dd5Alex Deymo// static
1334348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasanconst char* ConnectionManager::StringForConnectionType(
134f6ee0163504eaf1a7cc136ba2c075d77ae2b4dd5Alex Deymo    NetworkConnectionType type) {
13575eac7e523f825afdb88508922d7dc65fa366b19Alex Deymo  switch (type) {
13675eac7e523f825afdb88508922d7dc65fa366b19Alex Deymo    case NetworkConnectionType::kEthernet:
13775eac7e523f825afdb88508922d7dc65fa366b19Alex Deymo      return shill::kTypeEthernet;
13875eac7e523f825afdb88508922d7dc65fa366b19Alex Deymo    case NetworkConnectionType::kWifi:
13975eac7e523f825afdb88508922d7dc65fa366b19Alex Deymo      return shill::kTypeWifi;
14075eac7e523f825afdb88508922d7dc65fa366b19Alex Deymo    case NetworkConnectionType::kWimax:
14175eac7e523f825afdb88508922d7dc65fa366b19Alex Deymo      return shill::kTypeWimax;
14275eac7e523f825afdb88508922d7dc65fa366b19Alex Deymo    case NetworkConnectionType::kBluetooth:
14375eac7e523f825afdb88508922d7dc65fa366b19Alex Deymo      return shill::kTypeBluetooth;
14475eac7e523f825afdb88508922d7dc65fa366b19Alex Deymo    case NetworkConnectionType::kCellular:
14575eac7e523f825afdb88508922d7dc65fa366b19Alex Deymo      return shill::kTypeCellular;
14675eac7e523f825afdb88508922d7dc65fa366b19Alex Deymo    case NetworkConnectionType::kUnknown:
14775eac7e523f825afdb88508922d7dc65fa366b19Alex Deymo      return "Unknown";
148d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  }
14975eac7e523f825afdb88508922d7dc65fa366b19Alex Deymo  return "Unknown";
150d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes}
151d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
1526ae9120dc76ce9a3c8d05f71c05f23e3f4bdc6bdAlex Deymobool ConnectionManager::GetConnectionProperties(
1536ae9120dc76ce9a3c8d05f71c05f23e3f4bdc6bdAlex Deymo    NetworkConnectionType* out_type,
154305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo    NetworkTethering* out_tethering) {
155d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  string default_service_path;
156305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo  TEST_AND_RETURN_FALSE(GetDefaultServicePath(&default_service_path));
157305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo  if (default_service_path.empty())
158305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo    return false;
159305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo  TEST_AND_RETURN_FALSE(
160305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo      GetServicePathProperties(default_service_path, out_type, out_tethering));
161305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo  return true;
162305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo}
163305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo
164305345001d85ca2282112c2a30fe75c7a4773491Alex Deymobool ConnectionManager::GetDefaultServicePath(string* out_path) {
165305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo  chromeos::VariantDictionary properties;
166305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo  chromeos::ErrorPtr error;
167305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo  ManagerProxyInterface* manager_proxy = shill_proxy_->GetManagerProxy();
168305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo  if (!manager_proxy)
169305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo    return false;
170305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo  TEST_AND_RETURN_FALSE(manager_proxy->GetProperties(&properties, &error));
171305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo
172305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo  const auto& prop_default_service =
173305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo      properties.find(shill::kDefaultServiceProperty);
174305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo  if (prop_default_service == properties.end())
175305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo    return false;
176305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo
177305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo  *out_path = prop_default_service->second.TryGet<dbus::ObjectPath>().value();
178305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo  return !out_path->empty();
179305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo}
180305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo
181305345001d85ca2282112c2a30fe75c7a4773491Alex Deymobool ConnectionManager::GetServicePathProperties(
182305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo    const string& path,
183305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo    NetworkConnectionType* out_type,
184305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo    NetworkTethering* out_tethering) {
185305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo  // We create and dispose the ServiceProxyInterface on every request.
186305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo  std::unique_ptr<ServiceProxyInterface> service =
187305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo      shill_proxy_->GetServiceForPath(path);
188305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo
189305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo  chromeos::VariantDictionary properties;
190305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo  chromeos::ErrorPtr error;
191305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo  TEST_AND_RETURN_FALSE(service->GetProperties(&properties, &error));
192305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo
193305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo  // Populate the out_tethering.
194305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo  const auto& prop_tethering = properties.find(shill::kTetheringProperty);
195305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo  if (prop_tethering == properties.end()) {
196305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo    // Set to Unknown if not present.
197305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo    *out_tethering = NetworkTethering::kUnknown;
198305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo  } else {
199305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo    // If the property doesn't contain a string value, the empty string will
200305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo    // become kUnknown.
201305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo    *out_tethering = ParseTethering(prop_tethering->second.TryGet<string>());
202305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo  }
203305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo
204305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo  // Populate the out_type property.
205305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo  const auto& prop_type = properties.find(shill::kTypeProperty);
206305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo  if (prop_type == properties.end()) {
207305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo    // Set to Unknown if not present.
208305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo    *out_type = NetworkConnectionType::kUnknown;
209305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo    return false;
210305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo  }
211305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo
212305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo  string type_str = prop_type->second.TryGet<string>();
213305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo  if (type_str == shill::kTypeVPN) {
214305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo    const auto& prop_physical =
215305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo        properties.find(shill::kPhysicalTechnologyProperty);
216305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo    if (prop_physical == properties.end()) {
217305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo      LOG(ERROR) << "No PhysicalTechnology property found for a VPN"
218305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo                 << " connection (service: " << path << "). Returning default"
219305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo                 << " kUnknown value.";
220305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo      *out_type = NetworkConnectionType::kUnknown;
221305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo    } else {
222305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo      *out_type = ParseConnectionType(prop_physical->second.TryGet<string>());
223305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo    }
224305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo  } else {
225305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo    *out_type = ParseConnectionType(type_str);
226305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo  }
227d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  return true;
228d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes}
229d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
230d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes}  // namespace chromeos_update_engine
231