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