| OLD | NEW |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/chromeos/cros/network_library.h" | 5 #include "chrome/browser/chromeos/cros/network_library.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/utf_string_conversions.h" | 9 #include "base/utf_string_conversions.h" |
| 10 #include "chrome/browser/chrome_thread.h" | 10 #include "chrome/browser/chrome_thread.h" |
| 11 #include "chrome/browser/chromeos/cros/cros_library.h" | 11 #include "chrome/browser/chromeos/cros/cros_library.h" |
| 12 #include "net/url_request/url_request_job.h" | 12 #include "net/url_request/url_request_job.h" |
| 13 | 13 |
| 14 // Allows InvokeLater without adding refcounting. This class is a Singleton and | 14 // Allows InvokeLater without adding refcounting. This class is a Singleton and |
| 15 // won't be deleted until it's last InvokeLater is run. | 15 // won't be deleted until it's last InvokeLater is run. |
| 16 template <> | 16 template <> |
| 17 struct RunnableMethodTraits<chromeos::NetworkLibraryImpl> { | 17 struct RunnableMethodTraits<chromeos::NetworkLibraryImpl> { |
| 18 void RetainCallee(chromeos::NetworkLibraryImpl* obj) {} | 18 void RetainCallee(chromeos::NetworkLibraryImpl* obj) {} |
| 19 void ReleaseCallee(chromeos::NetworkLibraryImpl* obj) {} | 19 void ReleaseCallee(chromeos::NetworkLibraryImpl* obj) {} |
| 20 }; | 20 }; |
| 21 | 21 |
| 22 namespace chromeos { | 22 namespace chromeos { |
| 23 | 23 |
| 24 //////////////////////////////////////////////////////////////////////////////// | 24 //////////////////////////////////////////////////////////////////////////////// |
| 25 // Network |
| 26 |
| 27 void Network::Clear() { |
| 28 connecting_ = false; |
| 29 connected_ = false; |
| 30 service_path_.clear(); |
| 31 device_path_.clear(); |
| 32 ip_address_.clear(); |
| 33 } |
| 34 |
| 35 void Network::ConfigureFromService(const ServiceInfo& service) { |
| 36 connecting_ = service.state == STATE_ASSOCIATION || |
| 37 service.state == STATE_CONFIGURATION || |
| 38 service.state == STATE_CARRIER; |
| 39 connected_ = service.state == STATE_READY; |
| 40 service_path_ = service.service_path; |
| 41 device_path_ = service.device_path ? service.device_path : std::string(); |
| 42 ip_address_.clear(); |
| 43 // If connected, get ip config. |
| 44 if (connected_ && service.device_path) { |
| 45 IPConfigStatus* ipconfig_status = ListIPConfigs(service.device_path); |
| 46 if (ipconfig_status) { |
| 47 for (int i = 0; i < ipconfig_status->size; i++) { |
| 48 IPConfig ipconfig = ipconfig_status->ips[i]; |
| 49 if (strlen(ipconfig.address) > 0) |
| 50 ip_address_ = ipconfig.address; |
| 51 } |
| 52 FreeIPConfigStatus(ipconfig_status); |
| 53 } |
| 54 } |
| 55 } |
| 56 |
| 57 //////////////////////////////////////////////////////////////////////////////// |
| 58 // WirelessNetwork |
| 59 |
| 60 void WirelessNetwork::Clear() { |
| 61 Network::Clear(); |
| 62 name_.clear(); |
| 63 strength_ = 0; |
| 64 auto_connect_ = false; |
| 65 } |
| 66 |
| 67 void WirelessNetwork::ConfigureFromService(const ServiceInfo& service) { |
| 68 Network::ConfigureFromService(service); |
| 69 name_ = service.name; |
| 70 strength_ = service.strength; |
| 71 auto_connect_ = service.auto_connect; |
| 72 } |
| 73 |
| 74 //////////////////////////////////////////////////////////////////////////////// |
| 75 // WifiNetwork |
| 76 |
| 77 void WifiNetwork::Clear() { |
| 78 WirelessNetwork::Clear(); |
| 79 encryption_ = SECURITY_NONE; |
| 80 passphrase_.clear(); |
| 81 } |
| 82 |
| 83 void WifiNetwork::ConfigureFromService(const ServiceInfo& service) { |
| 84 WirelessNetwork::ConfigureFromService(service); |
| 85 encryption_ = service.security; |
| 86 passphrase_ = service.passphrase; |
| 87 } |
| 88 |
| 89 //////////////////////////////////////////////////////////////////////////////// |
| 25 // NetworkLibrary | 90 // NetworkLibrary |
| 26 | 91 |
| 27 // static | 92 // static |
| 28 const int NetworkLibraryImpl::kNetworkTrafficeTimerSecs = 1; | 93 const int NetworkLibraryImpl::kNetworkTrafficeTimerSecs = 1; |
| 29 | 94 |
| 30 NetworkLibraryImpl::NetworkLibraryImpl() | 95 NetworkLibraryImpl::NetworkLibraryImpl() |
| 31 : traffic_type_(0), | 96 : traffic_type_(0), |
| 32 network_status_connection_(NULL), | 97 network_status_connection_(NULL), |
| 33 available_devices_(0), | 98 available_devices_(0), |
| 34 enabled_devices_(0), | 99 enabled_devices_(0), |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 84 if (CrosLibrary::Get()->EnsureLoaded()) { | 149 if (CrosLibrary::Get()->EnsureLoaded()) { |
| 85 RequestScan(TYPE_WIFI); | 150 RequestScan(TYPE_WIFI); |
| 86 } | 151 } |
| 87 } | 152 } |
| 88 | 153 |
| 89 void NetworkLibraryImpl::ConnectToWifiNetwork(WifiNetwork network, | 154 void NetworkLibraryImpl::ConnectToWifiNetwork(WifiNetwork network, |
| 90 const string16& password, | 155 const string16& password, |
| 91 const string16& identity, | 156 const string16& identity, |
| 92 const string16& certpath) { | 157 const string16& certpath) { |
| 93 if (CrosLibrary::Get()->EnsureLoaded()) { | 158 if (CrosLibrary::Get()->EnsureLoaded()) { |
| 94 ConnectToNetworkWithCertInfo(network.service_path.c_str(), | 159 ConnectToNetworkWithCertInfo(network.service_path().c_str(), |
| 95 password.empty() ? NULL : UTF16ToUTF8(password).c_str(), | 160 password.empty() ? NULL : UTF16ToUTF8(password).c_str(), |
| 96 identity.empty() ? NULL : UTF16ToUTF8(identity).c_str(), | 161 identity.empty() ? NULL : UTF16ToUTF8(identity).c_str(), |
| 97 certpath.empty() ? NULL : UTF16ToUTF8(certpath).c_str()); | 162 certpath.empty() ? NULL : UTF16ToUTF8(certpath).c_str()); |
| 98 } | 163 } |
| 99 } | 164 } |
| 100 | 165 |
| 101 void NetworkLibraryImpl::ConnectToWifiNetwork(const string16& ssid, | 166 void NetworkLibraryImpl::ConnectToWifiNetwork(const string16& ssid, |
| 102 const string16& password, | 167 const string16& password, |
| 103 const string16& identity, | 168 const string16& identity, |
| 104 const string16& certpath, | 169 const string16& certpath, |
| (...skipping 15 matching lines...) Expand all Loading... |
| 120 FreeServiceInfo(service); | 185 FreeServiceInfo(service); |
| 121 } else { | 186 } else { |
| 122 LOG(WARNING) << "Cannot find hidden network: " << ssid; | 187 LOG(WARNING) << "Cannot find hidden network: " << ssid; |
| 123 // TODO(chocobo): Show error message. | 188 // TODO(chocobo): Show error message. |
| 124 } | 189 } |
| 125 } | 190 } |
| 126 } | 191 } |
| 127 | 192 |
| 128 void NetworkLibraryImpl::ConnectToCellularNetwork(CellularNetwork network) { | 193 void NetworkLibraryImpl::ConnectToCellularNetwork(CellularNetwork network) { |
| 129 if (CrosLibrary::Get()->EnsureLoaded()) { | 194 if (CrosLibrary::Get()->EnsureLoaded()) { |
| 130 ConnectToNetwork(network.service_path.c_str(), NULL); | 195 ConnectToNetwork(network.service_path().c_str(), NULL); |
| 131 } | 196 } |
| 132 } | 197 } |
| 133 | 198 |
| 134 void NetworkLibraryImpl::DisconnectFromWifiNetwork(const WifiNetwork& network) { | 199 void NetworkLibraryImpl::DisconnectFromWirelessNetwork( |
| 200 const WirelessNetwork& network) { |
| 135 if (CrosLibrary::Get()->EnsureLoaded()) { | 201 if (CrosLibrary::Get()->EnsureLoaded()) { |
| 136 DisconnectFromNetwork(network.service_path.c_str()); | 202 DisconnectFromNetwork(network.service_path().c_str()); |
| 137 } | |
| 138 } | |
| 139 | |
| 140 void NetworkLibraryImpl::DisconnectFromCellularNetwork( | |
| 141 const CellularNetwork& network) { | |
| 142 if (CrosLibrary::Get()->EnsureLoaded()) { | |
| 143 DisconnectFromNetwork(network.service_path.c_str()); | |
| 144 } | 203 } |
| 145 } | 204 } |
| 146 | 205 |
| 147 void NetworkLibraryImpl::SaveWifiNetwork(const WifiNetwork& network) { | 206 void NetworkLibraryImpl::SaveWifiNetwork(const WifiNetwork& network) { |
| 148 if (CrosLibrary::Get()->EnsureLoaded()) { | 207 if (CrosLibrary::Get()->EnsureLoaded()) { |
| 149 SetPassphrase(network.service_path.c_str(), network.passphrase.c_str()); | 208 SetPassphrase(network.service_path().c_str(), network.passphrase().c_str()); |
| 150 SetAutoConnect(network.service_path.c_str(), network.auto_connect); | 209 SetAutoConnect(network.service_path().c_str(), network.auto_connect()); |
| 151 } | 210 } |
| 152 } | 211 } |
| 153 | 212 |
| 154 void NetworkLibraryImpl::ForgetWifiNetwork(const WifiNetwork& network) { | 213 void NetworkLibraryImpl::ForgetWirelessNetwork(const WirelessNetwork& network) { |
| 155 if (CrosLibrary::Get()->EnsureLoaded()) { | 214 if (CrosLibrary::Get()->EnsureLoaded()) { |
| 156 DeleteRememberedService(network.service_path.c_str()); | 215 DeleteRememberedService(network.service_path().c_str()); |
| 157 } | |
| 158 } | |
| 159 | |
| 160 void NetworkLibraryImpl::ForgetCellularNetwork(const CellularNetwork& network) { | |
| 161 if (CrosLibrary::Get()->EnsureLoaded()) { | |
| 162 DeleteRememberedService(network.service_path.c_str()); | |
| 163 } | 216 } |
| 164 } | 217 } |
| 165 | 218 |
| 166 void NetworkLibraryImpl::EnableEthernetNetworkDevice(bool enable) { | 219 void NetworkLibraryImpl::EnableEthernetNetworkDevice(bool enable) { |
| 167 EnableNetworkDeviceType(TYPE_ETHERNET, enable); | 220 EnableNetworkDeviceType(TYPE_ETHERNET, enable); |
| 168 } | 221 } |
| 169 | 222 |
| 170 void NetworkLibraryImpl::EnableWifiNetworkDevice(bool enable) { | 223 void NetworkLibraryImpl::EnableWifiNetworkDevice(bool enable) { |
| 171 EnableNetworkDeviceType(TYPE_WIFI, enable); | 224 EnableNetworkDeviceType(TYPE_WIFI, enable); |
| 172 } | 225 } |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 226 } | 279 } |
| 227 | 280 |
| 228 // static | 281 // static |
| 229 void NetworkLibraryImpl::ParseSystem(SystemInfo* system, | 282 void NetworkLibraryImpl::ParseSystem(SystemInfo* system, |
| 230 EthernetNetwork* ethernet, | 283 EthernetNetwork* ethernet, |
| 231 WifiNetworkVector* wifi_networks, | 284 WifiNetworkVector* wifi_networks, |
| 232 CellularNetworkVector* cellular_networks, | 285 CellularNetworkVector* cellular_networks, |
| 233 WifiNetworkVector* remembered_wifi_networks, | 286 WifiNetworkVector* remembered_wifi_networks, |
| 234 CellularNetworkVector* remembered_cellular_networks) { | 287 CellularNetworkVector* remembered_cellular_networks) { |
| 235 DLOG(INFO) << "ParseSystem:"; | 288 DLOG(INFO) << "ParseSystem:"; |
| 236 bool ethernet_found = false; | 289 ethernet->Clear(); |
| 237 for (int i = 0; i < system->service_size; i++) { | 290 for (int i = 0; i < system->service_size; i++) { |
| 238 const ServiceInfo& service = system->services[i]; | 291 const ServiceInfo& service = system->services[i]; |
| 239 DLOG(INFO) << " (" << service.type << | 292 DLOG(INFO) << " (" << service.type << |
| 240 ") " << service.name << | 293 ") " << service.name << |
| 241 " mode=" << service.mode << | 294 " mode=" << service.mode << |
| 242 " state=" << service.state << | 295 " state=" << service.state << |
| 243 " sec=" << service.security << | 296 " sec=" << service.security << |
| 244 " req=" << service.passphrase_required << | 297 " req=" << service.passphrase_required << |
| 245 " pass=" << service.passphrase << | 298 " pass=" << service.passphrase << |
| 246 " str=" << service.strength << | 299 " str=" << service.strength << |
| 247 " fav=" << service.favorite << | 300 " fav=" << service.favorite << |
| 248 " auto=" << service.auto_connect << | 301 " auto=" << service.auto_connect << |
| 249 " error=" << service.error; | 302 " error=" << service.error; |
| 250 bool connecting = service.state == STATE_ASSOCIATION || | 303 if (service.type == TYPE_ETHERNET) |
| 251 service.state == STATE_CONFIGURATION || | 304 ethernet->ConfigureFromService(service); |
| 252 service.state == STATE_CARRIER; | 305 else if (service.type == TYPE_WIFI) |
| 253 bool connected = service.state == STATE_READY; | 306 wifi_networks->push_back(WifiNetwork(service)); |
| 254 // if connected, get ip config | 307 else if (service.type == TYPE_CELLULAR) |
| 255 std::string ip_address; | 308 cellular_networks->push_back(CellularNetwork(service)); |
| 256 if (connected && service.device_path) { | |
| 257 IPConfigStatus* ipconfig_status = ListIPConfigs(service.device_path); | |
| 258 if (ipconfig_status) { | |
| 259 for (int i = 0; i < ipconfig_status->size; i++) { | |
| 260 IPConfig ipconfig = ipconfig_status->ips[i]; | |
| 261 if (strlen(ipconfig.address) > 0) | |
| 262 ip_address = ipconfig.address; | |
| 263 DLOG(INFO) << " ipconfig: " << | |
| 264 " type=" << ipconfig.type << | |
| 265 " address=" << ipconfig.address << | |
| 266 " mtu=" << ipconfig.mtu << | |
| 267 " netmask=" << ipconfig.netmask << | |
| 268 " broadcast=" << ipconfig.broadcast << | |
| 269 " peer_address=" << ipconfig.peer_address << | |
| 270 " gateway=" << ipconfig.gateway << | |
| 271 " domainname=" << ipconfig.domainname << | |
| 272 " name_servers=" << ipconfig.name_servers; | |
| 273 } | |
| 274 FreeIPConfigStatus(ipconfig_status); | |
| 275 } | |
| 276 } | |
| 277 if (service.type == TYPE_ETHERNET) { | |
| 278 ethernet_found = true; | |
| 279 ethernet->connecting = connecting; | |
| 280 ethernet->connected = connected; | |
| 281 ethernet->device_path = service.device_path ? service.device_path : | |
| 282 std::string(); | |
| 283 ethernet->ip_address = ip_address; | |
| 284 } else if (service.type == TYPE_WIFI) { | |
| 285 wifi_networks->push_back(WifiNetwork(service, | |
| 286 connecting, | |
| 287 connected, | |
| 288 ip_address)); | |
| 289 } else if (service.type == TYPE_CELLULAR) { | |
| 290 cellular_networks->push_back(CellularNetwork(service, | |
| 291 connecting, | |
| 292 connected, | |
| 293 ip_address)); | |
| 294 } | |
| 295 } | |
| 296 if (!ethernet_found) { | |
| 297 ethernet->connecting = false; | |
| 298 ethernet->connected = false; | |
| 299 ethernet->device_path = std::string(); | |
| 300 ethernet->ip_address = std::string(); | |
| 301 } | 309 } |
| 302 DLOG(INFO) << "Remembered networks:"; | 310 DLOG(INFO) << "Remembered networks:"; |
| 303 for (int i = 0; i < system->remembered_service_size; i++) { | 311 for (int i = 0; i < system->remembered_service_size; i++) { |
| 304 const ServiceInfo& service = system->remembered_services[i]; | 312 const ServiceInfo& service = system->remembered_services[i]; |
| 305 // Only serices marked as auto_connect are considered remembered networks. | 313 // Only serices marked as auto_connect are considered remembered networks. |
| 306 // TODO(chocobo): Don't add to remembered service if currently available. | 314 // TODO(chocobo): Don't add to remembered service if currently available. |
| 307 if (service.auto_connect) { | 315 if (service.auto_connect) { |
| 308 DLOG(INFO) << " (" << service.type << | 316 DLOG(INFO) << " (" << service.type << |
| 309 ") " << service.name << | 317 ") " << service.name << |
| 310 " mode=" << service.mode << | 318 " mode=" << service.mode << |
| 311 " sec=" << service.security << | 319 " sec=" << service.security << |
| 312 " pass=" << service.passphrase << | 320 " pass=" << service.passphrase << |
| 313 " auto=" << service.auto_connect; | 321 " auto=" << service.auto_connect; |
| 314 if (service.type == TYPE_WIFI) { | 322 if (service.type == TYPE_WIFI) |
| 315 remembered_wifi_networks->push_back(WifiNetwork(service, | 323 remembered_wifi_networks->push_back(WifiNetwork(service)); |
| 316 false, | 324 else if (service.type == TYPE_CELLULAR) |
| 317 false, | 325 remembered_cellular_networks->push_back(CellularNetwork(service)); |
| 318 std::string())); | |
| 319 } else if (service.type == TYPE_CELLULAR) { | |
| 320 remembered_cellular_networks->push_back(CellularNetwork(service, | |
| 321 false, | |
| 322 false, | |
| 323 std::string())); | |
| 324 } | |
| 325 } | 326 } |
| 326 } | 327 } |
| 327 } | 328 } |
| 328 | 329 |
| 329 void NetworkLibraryImpl::Init() { | 330 void NetworkLibraryImpl::Init() { |
| 330 // First, get the currently available networks. This data is cached | 331 // First, get the currently available networks. This data is cached |
| 331 // on the connman side, so the call should be quick. | 332 // on the connman side, so the call should be quick. |
| 332 SystemInfo* system = GetSystemInfo(); | 333 SystemInfo* system = GetSystemInfo(); |
| 333 if (system) { | 334 if (system) { |
| 334 LOG(INFO) << "Getting initial CrOS network info."; | 335 LOG(INFO) << "Getting initial CrOS network info."; |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 373 | 374 |
| 374 wifi_networks_.clear(); | 375 wifi_networks_.clear(); |
| 375 cellular_networks_.clear(); | 376 cellular_networks_.clear(); |
| 376 remembered_wifi_networks_.clear(); | 377 remembered_wifi_networks_.clear(); |
| 377 remembered_cellular_networks_.clear(); | 378 remembered_cellular_networks_.clear(); |
| 378 ParseSystem(system, ðernet_, &wifi_networks_, &cellular_networks_, | 379 ParseSystem(system, ðernet_, &wifi_networks_, &cellular_networks_, |
| 379 &remembered_wifi_networks_, &remembered_cellular_networks_); | 380 &remembered_wifi_networks_, &remembered_cellular_networks_); |
| 380 | 381 |
| 381 wifi_ = WifiNetwork(); | 382 wifi_ = WifiNetwork(); |
| 382 for (size_t i = 0; i < wifi_networks_.size(); i++) { | 383 for (size_t i = 0; i < wifi_networks_.size(); i++) { |
| 383 if (wifi_networks_[i].connecting || wifi_networks_[i].connected) { | 384 if (wifi_networks_[i].connecting_or_connected()) { |
| 384 wifi_ = wifi_networks_[i]; | 385 wifi_ = wifi_networks_[i]; |
| 385 break; // There is only one connected or connecting wifi network. | 386 break; // There is only one connected or connecting wifi network. |
| 386 } | 387 } |
| 387 } | 388 } |
| 388 cellular_ = CellularNetwork(); | 389 cellular_ = CellularNetwork(); |
| 389 for (size_t i = 0; i < cellular_networks_.size(); i++) { | 390 for (size_t i = 0; i < cellular_networks_.size(); i++) { |
| 390 if (cellular_networks_[i].connecting || cellular_networks_[i].connected) { | 391 if (cellular_networks_[i].connecting_or_connected()) { |
| 391 cellular_ = cellular_networks_[i]; | 392 cellular_ = cellular_networks_[i]; |
| 392 break; // There is only one connected or connecting cellular network. | 393 break; // There is only one connected or connecting cellular network. |
| 393 } | 394 } |
| 394 } | 395 } |
| 395 | 396 |
| 396 available_devices_ = system->available_technologies; | 397 available_devices_ = system->available_technologies; |
| 397 enabled_devices_ = system->enabled_technologies; | 398 enabled_devices_ = system->enabled_technologies; |
| 398 connected_devices_ = system->connected_technologies; | 399 connected_devices_ = system->connected_technologies; |
| 399 offline_mode_ = system->offline_mode; | 400 offline_mode_ = system->offline_mode; |
| 400 | 401 |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 447 return ethernet_connected() || wifi_connected() || cellular_connected(); | 448 return ethernet_connected() || wifi_connected() || cellular_connected(); |
| 448 } | 449 } |
| 449 | 450 |
| 450 bool NetworkLibraryImpl::Connecting() const { | 451 bool NetworkLibraryImpl::Connecting() const { |
| 451 return ethernet_connecting() || wifi_connecting() || cellular_connecting(); | 452 return ethernet_connecting() || wifi_connecting() || cellular_connecting(); |
| 452 } | 453 } |
| 453 | 454 |
| 454 const std::string& NetworkLibraryImpl::IPAddress() const { | 455 const std::string& NetworkLibraryImpl::IPAddress() const { |
| 455 // Returns highest priority IP address. | 456 // Returns highest priority IP address. |
| 456 if (ethernet_connected()) | 457 if (ethernet_connected()) |
| 457 return ethernet_.ip_address; | 458 return ethernet_.ip_address(); |
| 458 if (wifi_connected()) | 459 if (wifi_connected()) |
| 459 return wifi_.ip_address; | 460 return wifi_.ip_address(); |
| 460 if (cellular_connected()) | 461 if (cellular_connected()) |
| 461 return cellular_.ip_address; | 462 return cellular_.ip_address(); |
| 462 return ethernet_.ip_address; | 463 return ethernet_.ip_address(); |
| 463 } | 464 } |
| 464 | 465 |
| 465 } // namespace chromeos | 466 } // namespace chromeos |
| OLD | NEW |