OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "components/wifi/wifi_service.h" | 5 #include "components/wifi/wifi_service.h" |
6 | 6 |
7 #include <iphlpapi.h> | 7 #include <iphlpapi.h> |
8 #include <objbase.h> | 8 #include <objbase.h> |
9 #include <wlanapi.h> | 9 #include <wlanapi.h> |
10 | 10 |
(...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
348 // Update |properties| based on bss info from |wlan_bss_list|. If |bssid| in | 348 // Update |properties| based on bss info from |wlan_bss_list|. If |bssid| in |
349 // |properties| is not empty, then it is not changed and |frequency| is set | 349 // |properties| is not empty, then it is not changed and |frequency| is set |
350 // based on that bssid. | 350 // based on that bssid. |
351 void UpdateNetworkPropertiesFromBssList(const std::string& network_guid, | 351 void UpdateNetworkPropertiesFromBssList(const std::string& network_guid, |
352 const WLAN_BSS_LIST& wlan_bss_list, | 352 const WLAN_BSS_LIST& wlan_bss_list, |
353 NetworkProperties* properties); | 353 NetworkProperties* properties); |
354 | 354 |
355 // Get the list of visible wireless networks. | 355 // Get the list of visible wireless networks. |
356 DWORD GetVisibleNetworkList(NetworkList* network_list); | 356 DWORD GetVisibleNetworkList(NetworkList* network_list); |
357 | 357 |
358 // Find currently connected network if any. Populate |connected_properties| | 358 // Get properties of the network currently used (connected or in transition) |
359 // on success. | 359 // by interface. Populate |current_properties| on success. |
360 DWORD GetConnectedProperties(NetworkProperties* connected_properties); | 360 DWORD GetCurrentProperties(NetworkProperties* current_properties); |
361 | 361 |
362 // Connect to network |network_guid| using previosly stored profile if exists, | 362 // Connect to network |network_guid| using previosly stored profile if exists, |
363 // or just network sid. If |frequency| is not |kFrequencyUnknown| then | 363 // or just network sid. If |frequency| is not |kFrequencyUnknown| then |
364 // connects only to BSS which uses that frequency and returns | 364 // connects only to BSS which uses that frequency and returns |
365 // |ERROR_NOT_FOUND| if such BSS cannot be found. | 365 // |ERROR_NOT_FOUND| if such BSS cannot be found. |
366 DWORD Connect(const std::string& network_guid, Frequency frequency); | 366 DWORD Connect(const std::string& network_guid, Frequency frequency); |
367 | 367 |
368 // Disconnect from currently connected network if any. | 368 // Disconnect from currently connected network if any. |
369 DWORD Disconnect(); | 369 DWORD Disconnect(); |
370 | 370 |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
508 } | 508 } |
509 | 509 |
510 void WiFiServiceImpl::GetProperties(const std::string& network_guid, | 510 void WiFiServiceImpl::GetProperties(const std::string& network_guid, |
511 base::DictionaryValue* properties, | 511 base::DictionaryValue* properties, |
512 std::string* error) { | 512 std::string* error) { |
513 DWORD error_code = EnsureInitialized(); | 513 DWORD error_code = EnsureInitialized(); |
514 if (CheckError(error_code, kWiFiServiceError, error)) | 514 if (CheckError(error_code, kWiFiServiceError, error)) |
515 return; | 515 return; |
516 | 516 |
517 NetworkProperties connected_properties; | 517 NetworkProperties connected_properties; |
518 error_code = GetConnectedProperties(&connected_properties); | 518 error_code = GetCurrentProperties(&connected_properties); |
519 if (error_code == ERROR_SUCCESS && | 519 if (error_code == ERROR_SUCCESS && |
520 connected_properties.guid == network_guid) { | 520 connected_properties.guid == network_guid) { |
521 properties->Swap(connected_properties.ToValue(false).get()); | 521 properties->Swap(connected_properties.ToValue(false).get()); |
522 return; | 522 return; |
523 } | 523 } |
524 | 524 |
525 NetworkList network_list; | 525 NetworkList network_list; |
526 error_code = GetVisibleNetworkList(&network_list); | 526 error_code = GetVisibleNetworkList(&network_list); |
527 if (error_code == ERROR_SUCCESS) { | 527 if (error_code == ERROR_SUCCESS) { |
528 NetworkList::const_iterator it = FindNetwork(network_list, network_guid); | 528 NetworkList::const_iterator it = FindNetwork(network_list, network_guid); |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
662 DVLOG(1) << "Start Connect: " << network_guid; | 662 DVLOG(1) << "Start Connect: " << network_guid; |
663 DWORD error_code = EnsureInitialized(); | 663 DWORD error_code = EnsureInitialized(); |
664 if (error_code == ERROR_SUCCESS) { | 664 if (error_code == ERROR_SUCCESS) { |
665 std::string connected_network_guid; | 665 std::string connected_network_guid; |
666 error_code = SaveCurrentConnectedNetwork(&connected_network_guid); | 666 error_code = SaveCurrentConnectedNetwork(&connected_network_guid); |
667 if (error_code == ERROR_SUCCESS) { | 667 if (error_code == ERROR_SUCCESS) { |
668 // Check, if the network is already connected on desired frequency. | 668 // Check, if the network is already connected on desired frequency. |
669 bool already_connected = (network_guid == connected_network_guid); | 669 bool already_connected = (network_guid == connected_network_guid); |
670 Frequency frequency = GetFrequencyToConnect(network_guid); | 670 Frequency frequency = GetFrequencyToConnect(network_guid); |
671 if (already_connected && frequency != kFrequencyAny) { | 671 if (already_connected && frequency != kFrequencyAny) { |
672 NetworkProperties connected_properties; | 672 NetworkProperties current_properties; |
673 if (GetConnectedProperties(&connected_properties) == ERROR_SUCCESS) { | 673 if (GetCurrentProperties(¤t_properties) == ERROR_SUCCESS) { |
674 already_connected = frequency == connected_properties.frequency && | 674 already_connected = current_properties.connection_state == |
675 network_guid == connected_properties.guid; | 675 onc::connection_state::kConnected && |
tbarzic
2014/04/23 16:50:20
nit: increasing indent (+4) here would make it eas
mef
2014/04/23 17:04:21
Done.
| |
676 frequency == current_properties.frequency && | |
677 network_guid == current_properties.guid; | |
676 } | 678 } |
677 } | 679 } |
678 // Connect only if network |network_guid| is not connected already. | 680 // Connect only if network |network_guid| is not connected already. |
679 if (!already_connected) | 681 if (!already_connected) |
680 error_code = Connect(network_guid, frequency); | 682 error_code = Connect(network_guid, frequency); |
681 if (error_code == ERROR_SUCCESS) { | 683 if (error_code == ERROR_SUCCESS) { |
682 // Notify that previously connected network has changed. | 684 // Notify that previously connected network has changed. |
683 NotifyNetworkChanged(connected_network_guid); | 685 NotifyNetworkChanged(connected_network_guid); |
684 // Start waiting for network connection state change. | 686 // Start waiting for network connection state change. |
685 if (!networks_changed_observer_.is_null()) { | 687 if (!networks_changed_observer_.is_null()) { |
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
887 LOG(ERROR) << "Failed to delete created profile for " << network_guid | 889 LOG(ERROR) << "Failed to delete created profile for " << network_guid |
888 << " error=" << error_code; | 890 << " error=" << error_code; |
889 } | 891 } |
890 } | 892 } |
891 } | 893 } |
892 // Restore automatic network change notifications and stop waiting. | 894 // Restore automatic network change notifications and stop waiting. |
893 enable_notify_network_changed_ = true; | 895 enable_notify_network_changed_ = true; |
894 RestoreNwCategoryWizard(); | 896 RestoreNwCategoryWizard(); |
895 return; | 897 return; |
896 } | 898 } |
897 NetworkProperties connected_network_properties; | 899 NetworkProperties current_properties; |
898 DWORD error = GetConnectedProperties(&connected_network_properties); | 900 DWORD error = GetCurrentProperties(¤t_properties); |
899 if (network_guid == connected_network_properties.guid && | 901 if (network_guid == current_properties.guid && |
900 connected_network_properties.connection_state == | 902 current_properties.connection_state == |
901 onc::connection_state::kConnected) { | 903 onc::connection_state::kConnected) { |
902 DVLOG(1) << "WiFi Connected, Reset DHCP: " << network_guid; | 904 DVLOG(1) << "WiFi Connected, Reset DHCP: " << network_guid; |
903 // Even though wireless network is now connected, it may still be unusable, | 905 // Even though wireless network is now connected, it may still be unusable, |
904 // e.g. after Chromecast device reset. Reset DHCP on wireless network to | 906 // e.g. after Chromecast device reset. Reset DHCP on wireless network to |
905 // work around this issue. | 907 // work around this issue. |
906 error = ResetDHCP(); | 908 error = ResetDHCP(); |
907 // There is no need to keep created profile as network is connected. | 909 // There is no need to keep created profile as network is connected. |
908 created_profiles_.RemoveWithoutPathExpansion(network_guid, NULL); | 910 created_profiles_.RemoveWithoutPathExpansion(network_guid, NULL); |
909 // Restore previously suppressed notifications. | 911 // Restore previously suppressed notifications. |
910 enable_notify_network_changed_ = true; | 912 enable_notify_network_changed_ = true; |
(...skipping 29 matching lines...) Expand all Loading... | |
940 ++it) { | 942 ++it) { |
941 if (it->guid == network_guid) | 943 if (it->guid == network_guid) |
942 return it; | 944 return it; |
943 } | 945 } |
944 return networks.end(); | 946 return networks.end(); |
945 } | 947 } |
946 | 948 |
947 DWORD WiFiServiceImpl::SaveCurrentConnectedNetwork( | 949 DWORD WiFiServiceImpl::SaveCurrentConnectedNetwork( |
948 std::string* connected_network_guid) { | 950 std::string* connected_network_guid) { |
949 // Find currently connected network. | 951 // Find currently connected network. |
950 NetworkProperties connected_network_properties; | 952 NetworkProperties current_properties; |
951 DWORD error = GetConnectedProperties(&connected_network_properties); | 953 DWORD error = GetCurrentProperties(¤t_properties); |
952 if (error == ERROR_SUCCESS && !connected_network_properties.guid.empty()) { | 954 if (error == ERROR_SUCCESS && !current_properties.guid.empty() && |
953 *connected_network_guid = connected_network_properties.guid; | 955 current_properties.connection_state == |
956 onc::connection_state::kConnected) { | |
957 *connected_network_guid = current_properties.guid; | |
954 SaveTempProfile(*connected_network_guid); | 958 SaveTempProfile(*connected_network_guid); |
955 std::string profile_xml; | 959 std::string profile_xml; |
956 error = GetProfile(*connected_network_guid, false, &profile_xml); | 960 error = GetProfile(*connected_network_guid, false, &profile_xml); |
957 if (error == ERROR_SUCCESS) { | 961 if (error == ERROR_SUCCESS) { |
958 saved_profiles_xml_[*connected_network_guid] = profile_xml; | 962 saved_profiles_xml_[*connected_network_guid] = profile_xml; |
959 } | 963 } |
960 } | 964 } |
961 return error; | 965 return error; |
962 } | 966 } |
963 | 967 |
(...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1378 // Clean up. | 1382 // Clean up. |
1379 if (available_network_list != NULL) { | 1383 if (available_network_list != NULL) { |
1380 WlanFreeMemory_function_(available_network_list); | 1384 WlanFreeMemory_function_(available_network_list); |
1381 } | 1385 } |
1382 if (bss_list != NULL) { | 1386 if (bss_list != NULL) { |
1383 WlanFreeMemory_function_(bss_list); | 1387 WlanFreeMemory_function_(bss_list); |
1384 } | 1388 } |
1385 return error; | 1389 return error; |
1386 } | 1390 } |
1387 | 1391 |
1388 DWORD WiFiServiceImpl::GetConnectedProperties(NetworkProperties* properties) { | 1392 DWORD WiFiServiceImpl::GetCurrentProperties(NetworkProperties* properties) { |
1389 if (client_ == NULL) { | 1393 if (client_ == NULL) { |
1390 NOTREACHED(); | 1394 NOTREACHED(); |
1391 return ERROR_NOINTERFACE; | 1395 return ERROR_NOINTERFACE; |
1392 } | 1396 } |
1393 | 1397 |
1394 // TODO(mef): WlanGetNetworkBssList is not available on XP. If XP support is | 1398 // TODO(mef): WlanGetNetworkBssList is not available on XP. If XP support is |
1395 // needed, then different method of getting BSS (e.g. OID query) will have | 1399 // needed, then different method of getting BSS (e.g. OID query) will have |
1396 // to be used. | 1400 // to be used. |
1397 if (WlanGetNetworkBssList_function_ == NULL) | 1401 if (WlanGetNetworkBssList_function_ == NULL) |
1398 return ERROR_NOINTERFACE; | 1402 return ERROR_NOINTERFACE; |
1399 | 1403 |
1400 Frequency frequency = kFrequencyUnknown; | |
1401 DWORD error = ERROR_SUCCESS; | 1404 DWORD error = ERROR_SUCCESS; |
1402 DWORD data_size = 0; | 1405 DWORD data_size = 0; |
1403 PWLAN_CONNECTION_ATTRIBUTES wlan_connection_attributes = NULL; | 1406 PWLAN_CONNECTION_ATTRIBUTES wlan_connection_attributes = NULL; |
1404 PWLAN_BSS_LIST bss_list = NULL; | 1407 PWLAN_BSS_LIST bss_list = NULL; |
1405 error = WlanQueryInterface_function_( | 1408 error = WlanQueryInterface_function_( |
1406 client_, | 1409 client_, |
1407 &interface_guid_, | 1410 &interface_guid_, |
1408 wlan_intf_opcode_current_connection, | 1411 wlan_intf_opcode_current_connection, |
1409 NULL, | 1412 NULL, |
1410 &data_size, | 1413 &data_size, |
1411 reinterpret_cast<PVOID*>(&wlan_connection_attributes), | 1414 reinterpret_cast<PVOID*>(&wlan_connection_attributes), |
1412 NULL); | 1415 NULL); |
1413 if (error == ERROR_SUCCESS && | 1416 if (error == ERROR_SUCCESS && |
1414 wlan_connection_attributes != NULL) { | 1417 wlan_connection_attributes != NULL) { |
1415 WLAN_ASSOCIATION_ATTRIBUTES& connected_wlan = | 1418 WLAN_ASSOCIATION_ATTRIBUTES& connected_wlan = |
1416 wlan_connection_attributes->wlanAssociationAttributes; | 1419 wlan_connection_attributes->wlanAssociationAttributes; |
1417 | 1420 |
1418 properties->connection_state = ConnectionStateFromInterfaceState( | 1421 properties->connection_state = ConnectionStateFromInterfaceState( |
1419 wlan_connection_attributes->isState); | 1422 wlan_connection_attributes->isState); |
1420 properties->ssid = GUIDFromSSID(connected_wlan.dot11Ssid); | 1423 properties->ssid = GUIDFromSSID(connected_wlan.dot11Ssid); |
1421 properties->name = properties->ssid; | 1424 properties->name = properties->ssid; |
1422 properties->guid = GUIDFromSSID(connected_wlan.dot11Ssid); | 1425 properties->guid = GUIDFromSSID(connected_wlan.dot11Ssid); |
1423 properties->type = onc::network_type::kWiFi; | 1426 properties->type = onc::network_type::kWiFi; |
1424 properties->bssid = NetworkProperties::MacAddressAsString( | 1427 properties->bssid = NetworkProperties::MacAddressAsString( |
1425 connected_wlan.dot11Bssid); | 1428 connected_wlan.dot11Bssid); |
1426 properties->security = SecurityFromDot11AuthAlg( | 1429 properties->security = SecurityFromDot11AuthAlg( |
1427 wlan_connection_attributes->wlanSecurityAttributes.dot11AuthAlgorithm); | 1430 wlan_connection_attributes->wlanSecurityAttributes.dot11AuthAlgorithm); |
1428 properties->signal_strength = connected_wlan.wlanSignalQuality; | 1431 properties->signal_strength = connected_wlan.wlanSignalQuality; |
1429 | 1432 |
1430 // TODO(mef): WlanGetNetworkBssList is not available on XP. If XP support is | |
1431 // needed, then different method of getting BSS (e.g. OID query) will have | |
1432 // to be used. | |
1433 error = WlanGetNetworkBssList_function_(client_, | 1433 error = WlanGetNetworkBssList_function_(client_, |
1434 &interface_guid_, | 1434 &interface_guid_, |
1435 &connected_wlan.dot11Ssid, | 1435 &connected_wlan.dot11Ssid, |
1436 connected_wlan.dot11BssType, | 1436 connected_wlan.dot11BssType, |
1437 FALSE, | 1437 FALSE, |
1438 NULL, | 1438 NULL, |
1439 &bss_list); | 1439 &bss_list); |
1440 if (error == ERROR_SUCCESS && NULL != bss_list) { | 1440 if (error == ERROR_SUCCESS && NULL != bss_list) { |
1441 UpdateNetworkPropertiesFromBssList(properties->guid, | 1441 UpdateNetworkPropertiesFromBssList(properties->guid, |
1442 *bss_list, | 1442 *bss_list, |
1443 properties); | 1443 properties); |
1444 } | 1444 } |
1445 } | 1445 } |
1446 | 1446 |
1447 // Clean up. | 1447 // Clean up. |
1448 if (wlan_connection_attributes != NULL) | 1448 if (wlan_connection_attributes != NULL) |
1449 WlanFreeMemory_function_(wlan_connection_attributes); | 1449 WlanFreeMemory_function_(wlan_connection_attributes); |
1450 | 1450 |
1451 if (bss_list != NULL) | 1451 if (bss_list != NULL) |
1452 WlanFreeMemory_function_(bss_list); | 1452 WlanFreeMemory_function_(bss_list); |
1453 | 1453 |
1454 return frequency; | 1454 return error; |
1455 } | 1455 } |
1456 | 1456 |
1457 WiFiService::Frequency WiFiServiceImpl::GetFrequencyToConnect( | 1457 WiFiService::Frequency WiFiServiceImpl::GetFrequencyToConnect( |
1458 const std::string& network_guid) const { | 1458 const std::string& network_guid) const { |
1459 // Check whether desired frequency is set in |connect_properties_|. | 1459 // Check whether desired frequency is set in |connect_properties_|. |
1460 const base::DictionaryValue* properties; | 1460 const base::DictionaryValue* properties; |
1461 const base::DictionaryValue* wifi; | 1461 const base::DictionaryValue* wifi; |
1462 int frequency; | 1462 int frequency; |
1463 if (connect_properties_.GetDictionaryWithoutPathExpansion( | 1463 if (connect_properties_.GetDictionaryWithoutPathExpansion( |
1464 network_guid, &properties) && | 1464 network_guid, &properties) && |
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1818 NetworkGuidList changed_networks(1, network_guid); | 1818 NetworkGuidList changed_networks(1, network_guid); |
1819 message_loop_proxy_->PostTask( | 1819 message_loop_proxy_->PostTask( |
1820 FROM_HERE, | 1820 FROM_HERE, |
1821 base::Bind(networks_changed_observer_, changed_networks)); | 1821 base::Bind(networks_changed_observer_, changed_networks)); |
1822 } | 1822 } |
1823 } | 1823 } |
1824 | 1824 |
1825 WiFiService* WiFiService::Create() { return new WiFiServiceImpl(); } | 1825 WiFiService* WiFiService::Create() { return new WiFiServiceImpl(); } |
1826 | 1826 |
1827 } // namespace wifi | 1827 } // namespace wifi |
OLD | NEW |