1dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius// 256c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius// Copyright (C) 2015 The Android Open Source Project 356c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius// 456c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius// Licensed under the Apache License, Version 2.0 (the "License"); 556c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius// you may not use this file except in compliance with the License. 656c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius// You may obtain a copy of the License at 756c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius// 856c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius// http://www.apache.org/licenses/LICENSE-2.0 956c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius// 1056c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius// Unless required by applicable law or agreed to in writing, software 1156c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius// distributed under the License is distributed on an "AS IS" BASIS, 1256c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1356c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius// See the License for the specific language governing permissions and 1456c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius// limitations under the License. 1556c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius// 1656c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius 17dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius#include <base/bind.h> 1828491fa4e8c3988c8797c542e1de0adfac120456Roshan Pius 199ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius#include "proxy_rpc_in_data_types.h" 209ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius#include "proxy_rpc_out_data_types.h" 21dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius#include "proxy_rpc_server.h" 220cfff2cca720299a104feab50413595236ebc626Roshan Pius#include "proxy_util.h" 23dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius 24dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Piusnamespace { 25dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius// XmlRpc library verbosity level. 26dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Piusstatic const int kDefaultXmlRpcVerbosity = 5; 27653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius// Profile name to be used for all the tests. 28653a064a5740670d60db78b511f73ee8f43a8397Roshan Piusstatic const char kTestProfileName[] = "test"; 29653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius 30653a064a5740670d60db78b511f73ee8f43a8397Roshan Piusbool ValidateNumOfElements(const XmlRpc::XmlRpcValue& value, int expected_num) { 31653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius if (expected_num != 0) { 32653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius return (value.valid() && value.size() == expected_num); 33653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius } else { 34653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius // |value| will be marked invalid when there are no elements. 35653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius return !value.valid(); 36653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius } 3728491fa4e8c3988c8797c542e1de0adfac120456Roshan Pius} 38653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius}// namespace 3928491fa4e8c3988c8797c542e1de0adfac120456Roshan Pius 40dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius/*************** RPC Method implementations **********/ 41ff0a5bfab9e361d818a7e14017523b9572bfd410Roshan PiusXmlRpc::XmlRpcValue CreateProfile( 42ff0a5bfab9e361d818a7e14017523b9572bfd410Roshan Pius XmlRpc::XmlRpcValue params_in, 43ff0a5bfab9e361d818a7e14017523b9572bfd410Roshan Pius ProxyShillWifiClient* shill_wifi_client) { 44653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius if (!ValidateNumOfElements(params_in, 1)) { 45ff0a5bfab9e361d818a7e14017523b9572bfd410Roshan Pius return false; 46dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius } 47dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius const std::string& profile_name(params_in[0]); 48ff0a5bfab9e361d818a7e14017523b9572bfd410Roshan Pius return shill_wifi_client->CreateProfile(profile_name); 49dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius} 5056c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius 51ff0a5bfab9e361d818a7e14017523b9572bfd410Roshan PiusXmlRpc::XmlRpcValue RemoveProfile( 52ff0a5bfab9e361d818a7e14017523b9572bfd410Roshan Pius XmlRpc::XmlRpcValue params_in, 53ff0a5bfab9e361d818a7e14017523b9572bfd410Roshan Pius ProxyShillWifiClient* shill_wifi_client) { 54653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius if (!ValidateNumOfElements(params_in, 1)) { 55ff0a5bfab9e361d818a7e14017523b9572bfd410Roshan Pius return false; 56dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius } 57dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius const std::string& profile_name(params_in[0]); 58ff0a5bfab9e361d818a7e14017523b9572bfd410Roshan Pius return shill_wifi_client->RemoveProfile(profile_name); 59dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius} 6056c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius 61ff0a5bfab9e361d818a7e14017523b9572bfd410Roshan PiusXmlRpc::XmlRpcValue PushProfile( 62ff0a5bfab9e361d818a7e14017523b9572bfd410Roshan Pius XmlRpc::XmlRpcValue params_in, 63ff0a5bfab9e361d818a7e14017523b9572bfd410Roshan Pius ProxyShillWifiClient* shill_wifi_client) { 64653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius if (!ValidateNumOfElements(params_in, 1)) { 65ff0a5bfab9e361d818a7e14017523b9572bfd410Roshan Pius return false; 66dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius } 67dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius const std::string& profile_name(params_in[0]); 68ff0a5bfab9e361d818a7e14017523b9572bfd410Roshan Pius return shill_wifi_client->PushProfile(profile_name); 6956c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius} 7056c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius 71ff0a5bfab9e361d818a7e14017523b9572bfd410Roshan PiusXmlRpc::XmlRpcValue PopProfile( 72ff0a5bfab9e361d818a7e14017523b9572bfd410Roshan Pius XmlRpc::XmlRpcValue params_in, 73ff0a5bfab9e361d818a7e14017523b9572bfd410Roshan Pius ProxyShillWifiClient* shill_wifi_client) { 74653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius if (!ValidateNumOfElements(params_in, 1)) { 75ff0a5bfab9e361d818a7e14017523b9572bfd410Roshan Pius return false; 76dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius } 77dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius const std::string& profile_name(params_in[0]); 78ff0a5bfab9e361d818a7e14017523b9572bfd410Roshan Pius return shill_wifi_client->PopProfile(profile_name); 79dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius} 8056c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius 81653a064a5740670d60db78b511f73ee8f43a8397Roshan PiusXmlRpc::XmlRpcValue CleanProfiles( 82653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius XmlRpc::XmlRpcValue params_in, 83653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius ProxyShillWifiClient* shill_wifi_client) { 84653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius if (!ValidateNumOfElements(params_in, 0)) { 85653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius return false; 86653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius } 87653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius return shill_wifi_client->CleanProfiles(); 88653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius} 89653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius 909ea15e4764c00c6013d5e1460c229de662419c87Roshan PiusXmlRpc::XmlRpcValue ConfigureServiceByGuid( 919ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius XmlRpc::XmlRpcValue params_in, 929ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius ProxyShillWifiClient* shill_wifi_client) { 939ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius if (!ValidateNumOfElements(params_in, 1)) { 949ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius return false; 959ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius } 969ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius ConfigureServiceParameters config_params(¶ms_in[0]); 979ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius return shill_wifi_client->ConfigureServiceByGuid( 989ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius config_params.guid_, 999ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius config_params.autoconnect_type_, 1009ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius config_params.passphrase_); 1019ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius} 1029ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius 1039ea15e4764c00c6013d5e1460c229de662419c87Roshan PiusXmlRpc::XmlRpcValue ConfigureWifiService( 1049ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius XmlRpc::XmlRpcValue params_in, 1059ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius ProxyShillWifiClient* shill_wifi_client) { 1069ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius if (!ValidateNumOfElements(params_in, 1)) { 1079ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius return false; 1089ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius } 1099ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius AssociationParameters assoc_params(¶ms_in[0]); 1109ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius brillo::VariantDictionary security_params; 1119ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius assoc_params.security_config_->GetServiceProperties(&security_params); 1129ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius return shill_wifi_client->ConfigureWifiService( 1139ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius assoc_params.ssid_, 1149ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius assoc_params.security_config_->security_, 1159ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius security_params, 1169ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius assoc_params.save_credentials_, 1179ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius assoc_params.station_type_, 1189ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius assoc_params.is_hidden_, 1199ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius assoc_params.guid_, 1209ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius assoc_params.autoconnect_type_); 1219ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius} 1229ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius 1239ea15e4764c00c6013d5e1460c229de662419c87Roshan PiusXmlRpc::XmlRpcValue ConnectWifi( 1249ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius XmlRpc::XmlRpcValue params_in, 1259ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius ProxyShillWifiClient* shill_wifi_client) { 1269ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius if (!ValidateNumOfElements(params_in, 1)) { 1279ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius return false; 1289ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius } 1299ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius 1309ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius AssociationParameters assoc_params(¶ms_in[0]); 1319ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius std::string wifi_interface = assoc_params.bgscan_config_->interface_; 1329ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius if (wifi_interface.empty()) { 1339ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius std::vector<std::string> interfaces; 1349ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius if (!shill_wifi_client->ListControlledWifiInterfaces(&interfaces) || 1359ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius interfaces.empty()) { 1369ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius return false; 1379ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius } 1389ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius wifi_interface = interfaces[0]; 1399ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius } 1409ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius shill_wifi_client->ConfigureBgScan( 1419ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius wifi_interface, 1429ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius assoc_params.bgscan_config_->method_, 1439ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius assoc_params.bgscan_config_->short_interval_, 1449ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius assoc_params.bgscan_config_->long_interval_, 1459ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius assoc_params.bgscan_config_->signal_threshold_); 1469ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius 1479ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius brillo::VariantDictionary security_params; 1489ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius assoc_params.security_config_->GetServiceProperties(&security_params); 1499ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius 1509ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius long discovery_time, association_time, configuration_time; 1519ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius std::string failure_reason; 1529ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius bool is_success = shill_wifi_client->ConnectToWifiNetwork( 1539ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius assoc_params.ssid_, 1549ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius assoc_params.security_config_->security_, 1559ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius security_params, 1569ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius assoc_params.save_credentials_, 1579ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius assoc_params.station_type_, 1589ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius assoc_params.is_hidden_, 1599ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius assoc_params.guid_, 1609ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius assoc_params.autoconnect_type_, 1619ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius GetMillisecondsFromSeconds(assoc_params.discovery_timeout_seconds_), 1629ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius GetMillisecondsFromSeconds(assoc_params.association_timeout_seconds_), 1639ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius GetMillisecondsFromSeconds(assoc_params.configuration_timeout_seconds_), 1649ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius &discovery_time, 1659ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius &association_time, 1669ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius &configuration_time, 1679ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius &failure_reason); 1689ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius 1699ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius AssociationResult association_result( 1709ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius is_success, 1719ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius GetSecondsFromMilliseconds(discovery_time), 1729ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius GetSecondsFromMilliseconds(association_time), 1739ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius GetSecondsFromMilliseconds(configuration_time), 1749ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius failure_reason); 1759ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius return association_result.ConvertToXmlRpcValue(); 1769ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius} 1779ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius 178653a064a5740670d60db78b511f73ee8f43a8397Roshan PiusXmlRpc::XmlRpcValue DeleteEntriesForSsid( 179653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius XmlRpc::XmlRpcValue params_in, 180653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius ProxyShillWifiClient* shill_wifi_client) { 181653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius if (!ValidateNumOfElements(params_in, 1)) { 182653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius return false; 183653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius } 184653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius const std::string& ssid(params_in[0]); 185653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius return shill_wifi_client->DeleteEntriesForSsid(ssid); 186653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius} 187653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius 188653a064a5740670d60db78b511f73ee8f43a8397Roshan PiusXmlRpc::XmlRpcValue InitTestNetworkState( 189653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius XmlRpc::XmlRpcValue params_in, 190653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius ProxyShillWifiClient* shill_wifi_client) { 191653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius if (!ValidateNumOfElements(params_in, 0)) { 192653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius return false; 193653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius } 1949ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius shill_wifi_client->SetLogging(); 195653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius shill_wifi_client->CleanProfiles(); 196653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius shill_wifi_client->RemoveAllWifiEntries(); 197653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius shill_wifi_client->RemoveProfile(kTestProfileName); 198653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius bool is_success = shill_wifi_client->CreateProfile(kTestProfileName); 199653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius if (is_success) { 200653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius shill_wifi_client->PushProfile(kTestProfileName); 201653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius } 202653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius return is_success; 203653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius} 204653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius 2052c637f2c756234fe165a69085a6d78b082302ba1Roshan PiusXmlRpc::XmlRpcValue ListControlledWifiInterfaces( 2062c637f2c756234fe165a69085a6d78b082302ba1Roshan Pius XmlRpc::XmlRpcValue params_in, 2072c637f2c756234fe165a69085a6d78b082302ba1Roshan Pius ProxyShillWifiClient* shill_wifi_client) { 2082c637f2c756234fe165a69085a6d78b082302ba1Roshan Pius if (!ValidateNumOfElements(params_in, 0)) { 2092c637f2c756234fe165a69085a6d78b082302ba1Roshan Pius return false; 2102c637f2c756234fe165a69085a6d78b082302ba1Roshan Pius } 2112c637f2c756234fe165a69085a6d78b082302ba1Roshan Pius std::vector<std::string> interfaces; 2122c637f2c756234fe165a69085a6d78b082302ba1Roshan Pius if (!shill_wifi_client->ListControlledWifiInterfaces(&interfaces)) { 2132c637f2c756234fe165a69085a6d78b082302ba1Roshan Pius return false; 2142c637f2c756234fe165a69085a6d78b082302ba1Roshan Pius } 2152c637f2c756234fe165a69085a6d78b082302ba1Roshan Pius XmlRpc::XmlRpcValue result; 2162c637f2c756234fe165a69085a6d78b082302ba1Roshan Pius int array_pos = 0; 2172c637f2c756234fe165a69085a6d78b082302ba1Roshan Pius for (const auto& interface : interfaces) { 2182c637f2c756234fe165a69085a6d78b082302ba1Roshan Pius result[array_pos++] = interface; 2192c637f2c756234fe165a69085a6d78b082302ba1Roshan Pius } 2202c637f2c756234fe165a69085a6d78b082302ba1Roshan Pius return result; 2212c637f2c756234fe165a69085a6d78b082302ba1Roshan Pius} 2222c637f2c756234fe165a69085a6d78b082302ba1Roshan Pius 2232c637f2c756234fe165a69085a6d78b082302ba1Roshan PiusXmlRpc::XmlRpcValue Disconnect( 2242c637f2c756234fe165a69085a6d78b082302ba1Roshan Pius XmlRpc::XmlRpcValue params_in, 2252c637f2c756234fe165a69085a6d78b082302ba1Roshan Pius ProxyShillWifiClient* shill_wifi_client) { 2262c637f2c756234fe165a69085a6d78b082302ba1Roshan Pius if (!ValidateNumOfElements(params_in, 1)) { 2272c637f2c756234fe165a69085a6d78b082302ba1Roshan Pius return false; 2282c637f2c756234fe165a69085a6d78b082302ba1Roshan Pius } 2292c637f2c756234fe165a69085a6d78b082302ba1Roshan Pius const std::string& ssid = params_in[0]; 2302c637f2c756234fe165a69085a6d78b082302ba1Roshan Pius return shill_wifi_client->Disconnect(ssid); 2312c637f2c756234fe165a69085a6d78b082302ba1Roshan Pius} 2322c637f2c756234fe165a69085a6d78b082302ba1Roshan Pius 2330cfff2cca720299a104feab50413595236ebc626Roshan PiusXmlRpc::XmlRpcValue WaitForServiceStates( 2340cfff2cca720299a104feab50413595236ebc626Roshan Pius XmlRpc::XmlRpcValue params_in, 2350cfff2cca720299a104feab50413595236ebc626Roshan Pius ProxyShillWifiClient* shill_wifi_client) { 2360cfff2cca720299a104feab50413595236ebc626Roshan Pius if (!ValidateNumOfElements(params_in, 3)) { 2370cfff2cca720299a104feab50413595236ebc626Roshan Pius return false; 2380cfff2cca720299a104feab50413595236ebc626Roshan Pius } 2390cfff2cca720299a104feab50413595236ebc626Roshan Pius const std::string& ssid(params_in[0]); 2400cfff2cca720299a104feab50413595236ebc626Roshan Pius XmlRpc::XmlRpcValue states_as_xmlrpcvalue(params_in[1]); 2410cfff2cca720299a104feab50413595236ebc626Roshan Pius int timeout(params_in[2]); 2420cfff2cca720299a104feab50413595236ebc626Roshan Pius int num_states = states_as_xmlrpcvalue.size(); 2430cfff2cca720299a104feab50413595236ebc626Roshan Pius std::vector<std::string> states; 2440cfff2cca720299a104feab50413595236ebc626Roshan Pius for (int array_pos = 0; array_pos < num_states; array_pos++) { 2450cfff2cca720299a104feab50413595236ebc626Roshan Pius states.emplace_back(std::string(states_as_xmlrpcvalue[array_pos])); 2460cfff2cca720299a104feab50413595236ebc626Roshan Pius } 2470cfff2cca720299a104feab50413595236ebc626Roshan Pius std::string final_state; 2480cfff2cca720299a104feab50413595236ebc626Roshan Pius long wait_time; 2490cfff2cca720299a104feab50413595236ebc626Roshan Pius bool is_success = shill_wifi_client->WaitForServiceStates( 2500cfff2cca720299a104feab50413595236ebc626Roshan Pius ssid, states, GetMillisecondsFromSeconds(timeout), 2510cfff2cca720299a104feab50413595236ebc626Roshan Pius &final_state, &wait_time); 2520cfff2cca720299a104feab50413595236ebc626Roshan Pius XmlRpc::XmlRpcValue result; 2530cfff2cca720299a104feab50413595236ebc626Roshan Pius result[0] = is_success; 2540cfff2cca720299a104feab50413595236ebc626Roshan Pius result[1] = final_state; 2550cfff2cca720299a104feab50413595236ebc626Roshan Pius result[2] = GetSecondsFromMilliseconds(wait_time); 2560cfff2cca720299a104feab50413595236ebc626Roshan Pius return result; 2570cfff2cca720299a104feab50413595236ebc626Roshan Pius} 2580cfff2cca720299a104feab50413595236ebc626Roshan Pius 25950a54ac9660a580f3b885ec6b3fa352ebbe60805Roshan PiusXmlRpc::XmlRpcValue GetServiceOrder( 26050a54ac9660a580f3b885ec6b3fa352ebbe60805Roshan Pius XmlRpc::XmlRpcValue params_in, 26150a54ac9660a580f3b885ec6b3fa352ebbe60805Roshan Pius ProxyShillWifiClient* shill_wifi_client) { 26250a54ac9660a580f3b885ec6b3fa352ebbe60805Roshan Pius if (!ValidateNumOfElements(params_in, 0)) { 26350a54ac9660a580f3b885ec6b3fa352ebbe60805Roshan Pius return false; 26450a54ac9660a580f3b885ec6b3fa352ebbe60805Roshan Pius } 26550a54ac9660a580f3b885ec6b3fa352ebbe60805Roshan Pius std::string order; 26650a54ac9660a580f3b885ec6b3fa352ebbe60805Roshan Pius if (!shill_wifi_client->GetServiceOrder(&order)) { 26750a54ac9660a580f3b885ec6b3fa352ebbe60805Roshan Pius return false; 26850a54ac9660a580f3b885ec6b3fa352ebbe60805Roshan Pius } 26950a54ac9660a580f3b885ec6b3fa352ebbe60805Roshan Pius return order; 27050a54ac9660a580f3b885ec6b3fa352ebbe60805Roshan Pius} 27150a54ac9660a580f3b885ec6b3fa352ebbe60805Roshan Pius 27250a54ac9660a580f3b885ec6b3fa352ebbe60805Roshan PiusXmlRpc::XmlRpcValue SetServiceOrder( 27350a54ac9660a580f3b885ec6b3fa352ebbe60805Roshan Pius XmlRpc::XmlRpcValue params_in, 27450a54ac9660a580f3b885ec6b3fa352ebbe60805Roshan Pius ProxyShillWifiClient* shill_wifi_client) { 27550a54ac9660a580f3b885ec6b3fa352ebbe60805Roshan Pius if (!ValidateNumOfElements(params_in, 1)) { 27650a54ac9660a580f3b885ec6b3fa352ebbe60805Roshan Pius return false; 27750a54ac9660a580f3b885ec6b3fa352ebbe60805Roshan Pius } 27850a54ac9660a580f3b885ec6b3fa352ebbe60805Roshan Pius const std::string& order(params_in[0]); 27950a54ac9660a580f3b885ec6b3fa352ebbe60805Roshan Pius return shill_wifi_client->SetServiceOrder(order); 28050a54ac9660a580f3b885ec6b3fa352ebbe60805Roshan Pius} 28150a54ac9660a580f3b885ec6b3fa352ebbe60805Roshan Pius 282c4e02e48a1eeb6bfb788e3adbb957584a2abb654Roshan PiusXmlRpc::XmlRpcValue GetServiceProperties( 283c4e02e48a1eeb6bfb788e3adbb957584a2abb654Roshan Pius XmlRpc::XmlRpcValue params_in, 284c4e02e48a1eeb6bfb788e3adbb957584a2abb654Roshan Pius ProxyShillWifiClient* shill_wifi_client) { 285c4e02e48a1eeb6bfb788e3adbb957584a2abb654Roshan Pius if (!ValidateNumOfElements(params_in, 1)) { 286c4e02e48a1eeb6bfb788e3adbb957584a2abb654Roshan Pius return false; 287c4e02e48a1eeb6bfb788e3adbb957584a2abb654Roshan Pius } 288c4e02e48a1eeb6bfb788e3adbb957584a2abb654Roshan Pius const std::string& ssid(params_in[0]); 289c4e02e48a1eeb6bfb788e3adbb957584a2abb654Roshan Pius brillo::VariantDictionary properties; 290c4e02e48a1eeb6bfb788e3adbb957584a2abb654Roshan Pius if (!shill_wifi_client->GetServiceProperties(ssid, &properties)) { 291c4e02e48a1eeb6bfb788e3adbb957584a2abb654Roshan Pius return false; 292c4e02e48a1eeb6bfb788e3adbb957584a2abb654Roshan Pius } 293c4e02e48a1eeb6bfb788e3adbb957584a2abb654Roshan Pius XmlRpc::XmlRpcValue result; 294c4e02e48a1eeb6bfb788e3adbb957584a2abb654Roshan Pius GetXmlRpcValueFromBrilloAnyValue(properties, &result); 295c4e02e48a1eeb6bfb788e3adbb957584a2abb654Roshan Pius return result; 296c4e02e48a1eeb6bfb788e3adbb957584a2abb654Roshan Pius} 297c4e02e48a1eeb6bfb788e3adbb957584a2abb654Roshan Pius 298c4e02e48a1eeb6bfb788e3adbb957584a2abb654Roshan PiusXmlRpc::XmlRpcValue GetActiveWifiSsids( 299c4e02e48a1eeb6bfb788e3adbb957584a2abb654Roshan Pius XmlRpc::XmlRpcValue params_in, 300c4e02e48a1eeb6bfb788e3adbb957584a2abb654Roshan Pius ProxyShillWifiClient* shill_wifi_client) { 301c4e02e48a1eeb6bfb788e3adbb957584a2abb654Roshan Pius if (!ValidateNumOfElements(params_in, 0)) { 302c4e02e48a1eeb6bfb788e3adbb957584a2abb654Roshan Pius return false; 303c4e02e48a1eeb6bfb788e3adbb957584a2abb654Roshan Pius } 304c4e02e48a1eeb6bfb788e3adbb957584a2abb654Roshan Pius std::vector<std::string> ssids; 305c4e02e48a1eeb6bfb788e3adbb957584a2abb654Roshan Pius if (!shill_wifi_client->GetActiveWifiSsids(&ssids)) { 306c4e02e48a1eeb6bfb788e3adbb957584a2abb654Roshan Pius return false; 307c4e02e48a1eeb6bfb788e3adbb957584a2abb654Roshan Pius } 308c4e02e48a1eeb6bfb788e3adbb957584a2abb654Roshan Pius XmlRpc::XmlRpcValue result; 309c4e02e48a1eeb6bfb788e3adbb957584a2abb654Roshan Pius int array_pos = 0; 310c4e02e48a1eeb6bfb788e3adbb957584a2abb654Roshan Pius for (const auto& ssid : ssids) { 311c4e02e48a1eeb6bfb788e3adbb957584a2abb654Roshan Pius result[array_pos++] = ssid; 312c4e02e48a1eeb6bfb788e3adbb957584a2abb654Roshan Pius } 313c4e02e48a1eeb6bfb788e3adbb957584a2abb654Roshan Pius return result; 314c4e02e48a1eeb6bfb788e3adbb957584a2abb654Roshan Pius} 315c4e02e48a1eeb6bfb788e3adbb957584a2abb654Roshan Pius 316c4e02e48a1eeb6bfb788e3adbb957584a2abb654Roshan PiusXmlRpc::XmlRpcValue SetSchedScan( 317c4e02e48a1eeb6bfb788e3adbb957584a2abb654Roshan Pius XmlRpc::XmlRpcValue params_in, 318c4e02e48a1eeb6bfb788e3adbb957584a2abb654Roshan Pius ProxyShillWifiClient* shill_wifi_client) { 319c4e02e48a1eeb6bfb788e3adbb957584a2abb654Roshan Pius if (!ValidateNumOfElements(params_in, 1)) { 320c4e02e48a1eeb6bfb788e3adbb957584a2abb654Roshan Pius return false; 321c4e02e48a1eeb6bfb788e3adbb957584a2abb654Roshan Pius } 322c4e02e48a1eeb6bfb788e3adbb957584a2abb654Roshan Pius bool enable(params_in[0]); 323c4e02e48a1eeb6bfb788e3adbb957584a2abb654Roshan Pius return shill_wifi_client->SetSchedScan(enable); 324c4e02e48a1eeb6bfb788e3adbb957584a2abb654Roshan Pius} 325c4e02e48a1eeb6bfb788e3adbb957584a2abb654Roshan Pius 3260e77da72f355e8fed61ef8a4e1f5e2e7b6312f63Roshan PiusXmlRpc::XmlRpcValue GetDbusPropertyOnDevice( 3270e77da72f355e8fed61ef8a4e1f5e2e7b6312f63Roshan Pius XmlRpc::XmlRpcValue params_in, 3280e77da72f355e8fed61ef8a4e1f5e2e7b6312f63Roshan Pius ProxyShillWifiClient* shill_wifi_client) { 3290e77da72f355e8fed61ef8a4e1f5e2e7b6312f63Roshan Pius if (!ValidateNumOfElements(params_in, 2)) { 3300e77da72f355e8fed61ef8a4e1f5e2e7b6312f63Roshan Pius return false; 3310e77da72f355e8fed61ef8a4e1f5e2e7b6312f63Roshan Pius } 3320e77da72f355e8fed61ef8a4e1f5e2e7b6312f63Roshan Pius const std::string& interface_name(params_in[0]); 3330e77da72f355e8fed61ef8a4e1f5e2e7b6312f63Roshan Pius const std::string& property_name(params_in[1]); 3340e77da72f355e8fed61ef8a4e1f5e2e7b6312f63Roshan Pius brillo::Any property_value; 3350e77da72f355e8fed61ef8a4e1f5e2e7b6312f63Roshan Pius if (!shill_wifi_client->GetPropertyOnDevice( 3360e77da72f355e8fed61ef8a4e1f5e2e7b6312f63Roshan Pius interface_name, property_name, &property_value)) { 3370e77da72f355e8fed61ef8a4e1f5e2e7b6312f63Roshan Pius return false; 3380e77da72f355e8fed61ef8a4e1f5e2e7b6312f63Roshan Pius } 3390e77da72f355e8fed61ef8a4e1f5e2e7b6312f63Roshan Pius XmlRpc::XmlRpcValue result; 3400e77da72f355e8fed61ef8a4e1f5e2e7b6312f63Roshan Pius GetXmlRpcValueFromBrilloAnyValue(property_value, &result); 3410e77da72f355e8fed61ef8a4e1f5e2e7b6312f63Roshan Pius return result; 3420e77da72f355e8fed61ef8a4e1f5e2e7b6312f63Roshan Pius} 3430e77da72f355e8fed61ef8a4e1f5e2e7b6312f63Roshan Pius 3440e77da72f355e8fed61ef8a4e1f5e2e7b6312f63Roshan PiusXmlRpc::XmlRpcValue SetDbusPropertyOnDevice( 3450e77da72f355e8fed61ef8a4e1f5e2e7b6312f63Roshan Pius XmlRpc::XmlRpcValue params_in, 3460e77da72f355e8fed61ef8a4e1f5e2e7b6312f63Roshan Pius ProxyShillWifiClient* shill_wifi_client) { 3470e77da72f355e8fed61ef8a4e1f5e2e7b6312f63Roshan Pius if (!ValidateNumOfElements(params_in, 3)) { 3480e77da72f355e8fed61ef8a4e1f5e2e7b6312f63Roshan Pius return false; 3490e77da72f355e8fed61ef8a4e1f5e2e7b6312f63Roshan Pius } 3500e77da72f355e8fed61ef8a4e1f5e2e7b6312f63Roshan Pius const std::string& interface_name(params_in[0]); 3510e77da72f355e8fed61ef8a4e1f5e2e7b6312f63Roshan Pius const std::string& property_name(params_in[1]); 3520e77da72f355e8fed61ef8a4e1f5e2e7b6312f63Roshan Pius brillo::Any property_value; 3530e77da72f355e8fed61ef8a4e1f5e2e7b6312f63Roshan Pius GetBrilloAnyValueFromXmlRpcValue(¶ms_in[2], &property_value); 3540e77da72f355e8fed61ef8a4e1f5e2e7b6312f63Roshan Pius return shill_wifi_client->SetPropertyOnDevice( 3550e77da72f355e8fed61ef8a4e1f5e2e7b6312f63Roshan Pius interface_name, property_name, property_value); 3560e77da72f355e8fed61ef8a4e1f5e2e7b6312f63Roshan Pius} 3570e77da72f355e8fed61ef8a4e1f5e2e7b6312f63Roshan Pius 358b1e4998befbb945b08a39801ddc89c45804406dfRoshan PiusXmlRpc::XmlRpcValue RequestRoamDbus( 359b1e4998befbb945b08a39801ddc89c45804406dfRoshan Pius XmlRpc::XmlRpcValue params_in, 360b1e4998befbb945b08a39801ddc89c45804406dfRoshan Pius ProxyShillWifiClient* shill_wifi_client) { 361b1e4998befbb945b08a39801ddc89c45804406dfRoshan Pius if (!ValidateNumOfElements(params_in, 2)) { 362b1e4998befbb945b08a39801ddc89c45804406dfRoshan Pius return false; 363b1e4998befbb945b08a39801ddc89c45804406dfRoshan Pius } 364b1e4998befbb945b08a39801ddc89c45804406dfRoshan Pius const std::string& bssid(params_in[0]); 365b1e4998befbb945b08a39801ddc89c45804406dfRoshan Pius const std::string& interface_name(params_in[1]); 366b1e4998befbb945b08a39801ddc89c45804406dfRoshan Pius // |interface_name| is the first argument in ProxyShillWifiClient method 367b1e4998befbb945b08a39801ddc89c45804406dfRoshan Pius // to keep it symmetric with other methods defined in the interface even 368b1e4998befbb945b08a39801ddc89c45804406dfRoshan Pius // though it is reversed in the RPC call. 369b1e4998befbb945b08a39801ddc89c45804406dfRoshan Pius return shill_wifi_client->RequestRoam(interface_name, bssid); 370b1e4998befbb945b08a39801ddc89c45804406dfRoshan Pius} 371b1e4998befbb945b08a39801ddc89c45804406dfRoshan Pius 372b1e4998befbb945b08a39801ddc89c45804406dfRoshan PiusXmlRpc::XmlRpcValue SetDeviceEnabled( 373b1e4998befbb945b08a39801ddc89c45804406dfRoshan Pius XmlRpc::XmlRpcValue params_in, 374b1e4998befbb945b08a39801ddc89c45804406dfRoshan Pius ProxyShillWifiClient* shill_wifi_client) { 375b1e4998befbb945b08a39801ddc89c45804406dfRoshan Pius if (!ValidateNumOfElements(params_in, 2)) { 376b1e4998befbb945b08a39801ddc89c45804406dfRoshan Pius return false; 377b1e4998befbb945b08a39801ddc89c45804406dfRoshan Pius } 378b1e4998befbb945b08a39801ddc89c45804406dfRoshan Pius const std::string& interface_name(params_in[0]); 379b1e4998befbb945b08a39801ddc89c45804406dfRoshan Pius bool enable(params_in[1]); 380b1e4998befbb945b08a39801ddc89c45804406dfRoshan Pius return shill_wifi_client->SetDeviceEnabled(interface_name, enable); 381b1e4998befbb945b08a39801ddc89c45804406dfRoshan Pius} 382b1e4998befbb945b08a39801ddc89c45804406dfRoshan Pius 38360b85ccc30429df48f74cf055810561e01880203Roshan PiusXmlRpc::XmlRpcValue DiscoverTdlsLink( 38460b85ccc30429df48f74cf055810561e01880203Roshan Pius XmlRpc::XmlRpcValue params_in, 38560b85ccc30429df48f74cf055810561e01880203Roshan Pius ProxyShillWifiClient* shill_wifi_client) { 38660b85ccc30429df48f74cf055810561e01880203Roshan Pius if (!ValidateNumOfElements(params_in, 2)) { 38760b85ccc30429df48f74cf055810561e01880203Roshan Pius return false; 38860b85ccc30429df48f74cf055810561e01880203Roshan Pius } 38960b85ccc30429df48f74cf055810561e01880203Roshan Pius const std::string& interface_name(params_in[0]); 39060b85ccc30429df48f74cf055810561e01880203Roshan Pius const std::string& peer_mac_address(params_in[1]); 39160b85ccc30429df48f74cf055810561e01880203Roshan Pius return shill_wifi_client->DiscoverTdlsLink(interface_name, peer_mac_address); 39260b85ccc30429df48f74cf055810561e01880203Roshan Pius} 39360b85ccc30429df48f74cf055810561e01880203Roshan Pius 39460b85ccc30429df48f74cf055810561e01880203Roshan PiusXmlRpc::XmlRpcValue EstablishTdlsLink( 39560b85ccc30429df48f74cf055810561e01880203Roshan Pius XmlRpc::XmlRpcValue params_in, 39660b85ccc30429df48f74cf055810561e01880203Roshan Pius ProxyShillWifiClient* shill_wifi_client) { 39760b85ccc30429df48f74cf055810561e01880203Roshan Pius if (!ValidateNumOfElements(params_in, 2)) { 39860b85ccc30429df48f74cf055810561e01880203Roshan Pius return false; 39960b85ccc30429df48f74cf055810561e01880203Roshan Pius } 40060b85ccc30429df48f74cf055810561e01880203Roshan Pius const std::string& interface_name(params_in[0]); 40160b85ccc30429df48f74cf055810561e01880203Roshan Pius const std::string& peer_mac_address(params_in[1]); 40260b85ccc30429df48f74cf055810561e01880203Roshan Pius return shill_wifi_client->EstablishTdlsLink(interface_name, peer_mac_address); 40360b85ccc30429df48f74cf055810561e01880203Roshan Pius} 40460b85ccc30429df48f74cf055810561e01880203Roshan Pius 40560b85ccc30429df48f74cf055810561e01880203Roshan PiusXmlRpc::XmlRpcValue QueryTdlsLink( 40660b85ccc30429df48f74cf055810561e01880203Roshan Pius XmlRpc::XmlRpcValue params_in, 40760b85ccc30429df48f74cf055810561e01880203Roshan Pius ProxyShillWifiClient* shill_wifi_client) { 40860b85ccc30429df48f74cf055810561e01880203Roshan Pius if (!ValidateNumOfElements(params_in, 2)) { 40960b85ccc30429df48f74cf055810561e01880203Roshan Pius return false; 41060b85ccc30429df48f74cf055810561e01880203Roshan Pius } 41160b85ccc30429df48f74cf055810561e01880203Roshan Pius const std::string& interface_name(params_in[0]); 41260b85ccc30429df48f74cf055810561e01880203Roshan Pius const std::string& peer_mac_address(params_in[1]); 41360b85ccc30429df48f74cf055810561e01880203Roshan Pius std::string status; 41460b85ccc30429df48f74cf055810561e01880203Roshan Pius if (!shill_wifi_client->QueryTdlsLink( 41560b85ccc30429df48f74cf055810561e01880203Roshan Pius interface_name, peer_mac_address, &status)) { 41660b85ccc30429df48f74cf055810561e01880203Roshan Pius return false; 41760b85ccc30429df48f74cf055810561e01880203Roshan Pius } 41860b85ccc30429df48f74cf055810561e01880203Roshan Pius return status; 41960b85ccc30429df48f74cf055810561e01880203Roshan Pius} 42051ac846707cf05933612cb111f173afec146c267Roshan Pius 42151ac846707cf05933612cb111f173afec146c267Roshan PiusXmlRpc::XmlRpcValue AddWakePacketSource( 42251ac846707cf05933612cb111f173afec146c267Roshan Pius XmlRpc::XmlRpcValue params_in, 42351ac846707cf05933612cb111f173afec146c267Roshan Pius ProxyShillWifiClient* shill_wifi_client) { 42451ac846707cf05933612cb111f173afec146c267Roshan Pius if (!ValidateNumOfElements(params_in, 2)) { 42551ac846707cf05933612cb111f173afec146c267Roshan Pius return false; 42651ac846707cf05933612cb111f173afec146c267Roshan Pius } 42751ac846707cf05933612cb111f173afec146c267Roshan Pius const std::string& interface_name(params_in[0]); 42851ac846707cf05933612cb111f173afec146c267Roshan Pius const std::string& source_ip(params_in[1]); 42951ac846707cf05933612cb111f173afec146c267Roshan Pius return shill_wifi_client->AddWakePacketSource(interface_name, source_ip); 43051ac846707cf05933612cb111f173afec146c267Roshan Pius} 43151ac846707cf05933612cb111f173afec146c267Roshan Pius 43251ac846707cf05933612cb111f173afec146c267Roshan PiusXmlRpc::XmlRpcValue RemoveWakePacketSource( 43351ac846707cf05933612cb111f173afec146c267Roshan Pius XmlRpc::XmlRpcValue params_in, 43451ac846707cf05933612cb111f173afec146c267Roshan Pius ProxyShillWifiClient* shill_wifi_client) { 43551ac846707cf05933612cb111f173afec146c267Roshan Pius if (!ValidateNumOfElements(params_in, 2)) { 43651ac846707cf05933612cb111f173afec146c267Roshan Pius return false; 43751ac846707cf05933612cb111f173afec146c267Roshan Pius } 43851ac846707cf05933612cb111f173afec146c267Roshan Pius const std::string& interface_name(params_in[0]); 43951ac846707cf05933612cb111f173afec146c267Roshan Pius const std::string& source_ip(params_in[1]); 44051ac846707cf05933612cb111f173afec146c267Roshan Pius return shill_wifi_client->RemoveWakePacketSource(interface_name, source_ip); 44151ac846707cf05933612cb111f173afec146c267Roshan Pius} 44251ac846707cf05933612cb111f173afec146c267Roshan Pius 44351ac846707cf05933612cb111f173afec146c267Roshan PiusXmlRpc::XmlRpcValue RemoveAllWakePacketSources( 44451ac846707cf05933612cb111f173afec146c267Roshan Pius XmlRpc::XmlRpcValue params_in, 44551ac846707cf05933612cb111f173afec146c267Roshan Pius ProxyShillWifiClient* shill_wifi_client) { 44651ac846707cf05933612cb111f173afec146c267Roshan Pius if (!ValidateNumOfElements(params_in, 1)) { 44751ac846707cf05933612cb111f173afec146c267Roshan Pius return false; 44851ac846707cf05933612cb111f173afec146c267Roshan Pius } 44951ac846707cf05933612cb111f173afec146c267Roshan Pius const std::string& interface_name(params_in[0]); 45051ac846707cf05933612cb111f173afec146c267Roshan Pius return shill_wifi_client->RemoveAllWakePacketSources(interface_name); 45151ac846707cf05933612cb111f173afec146c267Roshan Pius} 45251ac846707cf05933612cb111f173afec146c267Roshan Pius 453e6833dc3d92ce13a87b0c5c0926241025410d756Roshan PiusXmlRpc::XmlRpcValue SyncTimeTo( 454e6833dc3d92ce13a87b0c5c0926241025410d756Roshan Pius XmlRpc::XmlRpcValue params_in, 455e6833dc3d92ce13a87b0c5c0926241025410d756Roshan Pius ProxyShillWifiClient* shill_wifi_client) { 456e6833dc3d92ce13a87b0c5c0926241025410d756Roshan Pius if (!ValidateNumOfElements(params_in, 1)) { 457e6833dc3d92ce13a87b0c5c0926241025410d756Roshan Pius return false; 458e6833dc3d92ce13a87b0c5c0926241025410d756Roshan Pius } 459e6833dc3d92ce13a87b0c5c0926241025410d756Roshan Pius double epoch_seconds(params_in[0]); 460e6833dc3d92ce13a87b0c5c0926241025410d756Roshan Pius double seconds; 461e6833dc3d92ce13a87b0c5c0926241025410d756Roshan Pius double microseconds = modf(epoch_seconds, &seconds) * 1000000; 462e6833dc3d92ce13a87b0c5c0926241025410d756Roshan Pius struct timeval tv; 463e6833dc3d92ce13a87b0c5c0926241025410d756Roshan Pius tv.tv_sec = seconds; 464e6833dc3d92ce13a87b0c5c0926241025410d756Roshan Pius tv.tv_usec = microseconds; 465e6833dc3d92ce13a87b0c5c0926241025410d756Roshan Pius return settimeofday(&tv, nullptr); 466e6833dc3d92ce13a87b0c5c0926241025410d756Roshan Pius} 467e6833dc3d92ce13a87b0c5c0926241025410d756Roshan Pius 468e6833dc3d92ce13a87b0c5c0926241025410d756Roshan Pius// Dummy method to be used for rpc methods not implemented yet. 469e6833dc3d92ce13a87b0c5c0926241025410d756Roshan PiusXmlRpc::XmlRpcValue NotImplementedRpcMethod( 470e6833dc3d92ce13a87b0c5c0926241025410d756Roshan Pius XmlRpc::XmlRpcValue params_in, 471e6833dc3d92ce13a87b0c5c0926241025410d756Roshan Pius ProxyShillWifiClient* shill_wifi_client) { 472e6833dc3d92ce13a87b0c5c0926241025410d756Roshan Pius LOG(ERROR) << "RPC Method not implemented."; 473e6833dc3d92ce13a87b0c5c0926241025410d756Roshan Pius return true; 474e6833dc3d92ce13a87b0c5c0926241025410d756Roshan Pius} 475e6833dc3d92ce13a87b0c5c0926241025410d756Roshan Pius 47628491fa4e8c3988c8797c542e1de0adfac120456Roshan PiusProxyRpcServerMethod::ProxyRpcServerMethod( 477dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius const std::string& method_name, 478dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius const RpcServerMethodHandler& handler, 479dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius ProxyShillWifiClient* shill_wifi_client, 480ff0a5bfab9e361d818a7e14017523b9572bfd410Roshan Pius ProxyRpcServer* server) 481dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius : XmlRpcServerMethod(method_name, server), 482dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius handler_(handler), 483dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius shill_wifi_client_(shill_wifi_client) { 48428491fa4e8c3988c8797c542e1de0adfac120456Roshan Pius} 48528491fa4e8c3988c8797c542e1de0adfac120456Roshan Pius 486dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Piusvoid ProxyRpcServerMethod::execute( 487ff0a5bfab9e361d818a7e14017523b9572bfd410Roshan Pius XmlRpc::XmlRpcValue& params_in, 488ff0a5bfab9e361d818a7e14017523b9572bfd410Roshan Pius XmlRpc::XmlRpcValue& value_out) { 489dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius value_out = handler_.Run(params_in, shill_wifi_client_); 490dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius} 49156c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius 492dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Piusstd::string ProxyRpcServerMethod::help(void) { 493dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius // TODO: Lookup the method help using the |method_name| from 494dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius // a text file. 495dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius return "Shill Test Proxy RPC methods help."; 496dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius} 4979040f7dd043943832e96a37f53fa33c287f84781Roshan Pius 498dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan PiusProxyRpcServer::ProxyRpcServer( 499dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius int server_port, 500dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius std::unique_ptr<ProxyShillWifiClient> shill_wifi_client) 501dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius : XmlRpcServer(), 502dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius server_port_(server_port), 503dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius shill_wifi_client_(std::move(shill_wifi_client)) { 504dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius} 50556c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius 506dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Piusvoid ProxyRpcServer::RegisterRpcMethod( 507dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius const std::string& method_name, 508dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius const RpcServerMethodHandler& handler) { 509dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius methods_.emplace_back( 510dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius new ProxyRpcServerMethod( 511dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius method_name, handler, shill_wifi_client_.get(), this)); 512dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius} 51356c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius 514dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Piusvoid ProxyRpcServer::Run() { 515dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius XmlRpc::setVerbosity(kDefaultXmlRpcVerbosity); 516ff0a5bfab9e361d818a7e14017523b9572bfd410Roshan Pius if (!XmlRpc::XmlRpcServer::bindAndListen(server_port_)) { 517dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius LOG(ERROR) << "Failed to bind to port " << server_port_ << "."; 518dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius return; 519dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius } 520ff0a5bfab9e361d818a7e14017523b9572bfd410Roshan Pius XmlRpc::XmlRpcServer::enableIntrospection(true); 52156c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius 522dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius RegisterRpcMethod("create_profile", base::Bind(&CreateProfile)); 523dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius RegisterRpcMethod("remove_profile", base::Bind(&RemoveProfile)); 524dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius RegisterRpcMethod("push_profile", base::Bind(&PushProfile)); 525dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius RegisterRpcMethod("pop_profile", base::Bind(&PopProfile)); 526653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius RegisterRpcMethod("clean_profiles", base::Bind(&CleanProfiles)); 5279ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius RegisterRpcMethod("configure_service_by_guid", 5289ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius base::Bind(&ConfigureServiceByGuid)); 5299ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius RegisterRpcMethod("configure_wifi_service", base::Bind(&ConfigureWifiService)); 5309ea15e4764c00c6013d5e1460c229de662419c87Roshan Pius RegisterRpcMethod("connect_wifi", base::Bind(&ConnectWifi)); 531653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius RegisterRpcMethod("delete_entries_for_ssid", base::Bind(&DeleteEntriesForSsid)); 532653a064a5740670d60db78b511f73ee8f43a8397Roshan Pius RegisterRpcMethod("init_test_network_state", base::Bind(&InitTestNetworkState)); 5332c637f2c756234fe165a69085a6d78b082302ba1Roshan Pius RegisterRpcMethod("list_controlled_wifi_interfaces", 5342c637f2c756234fe165a69085a6d78b082302ba1Roshan Pius base::Bind(&ListControlledWifiInterfaces)); 5352c637f2c756234fe165a69085a6d78b082302ba1Roshan Pius RegisterRpcMethod("disconnect", base::Bind(&Disconnect)); 5360cfff2cca720299a104feab50413595236ebc626Roshan Pius RegisterRpcMethod("wait_for_service_states", 5370cfff2cca720299a104feab50413595236ebc626Roshan Pius base::Bind(&WaitForServiceStates)); 53850a54ac9660a580f3b885ec6b3fa352ebbe60805Roshan Pius RegisterRpcMethod("get_service_order", base::Bind(&GetServiceOrder)); 53950a54ac9660a580f3b885ec6b3fa352ebbe60805Roshan Pius RegisterRpcMethod("set_service_order", base::Bind(&SetServiceOrder)); 540c4e02e48a1eeb6bfb788e3adbb957584a2abb654Roshan Pius RegisterRpcMethod("get_service_properties", base::Bind(&GetServiceProperties)); 541c4e02e48a1eeb6bfb788e3adbb957584a2abb654Roshan Pius RegisterRpcMethod("get_active_wifi_SSIDs", base::Bind(&GetActiveWifiSsids)); 542c4e02e48a1eeb6bfb788e3adbb957584a2abb654Roshan Pius RegisterRpcMethod("set_sched_scan", base::Bind(&SetSchedScan)); 5430e77da72f355e8fed61ef8a4e1f5e2e7b6312f63Roshan Pius RegisterRpcMethod("get_dbus_property_on_device", 5440e77da72f355e8fed61ef8a4e1f5e2e7b6312f63Roshan Pius base::Bind(&GetDbusPropertyOnDevice)); 5450e77da72f355e8fed61ef8a4e1f5e2e7b6312f63Roshan Pius RegisterRpcMethod("set_dbus_property_on_device", 5460e77da72f355e8fed61ef8a4e1f5e2e7b6312f63Roshan Pius base::Bind(&SetDbusPropertyOnDevice)); 547b1e4998befbb945b08a39801ddc89c45804406dfRoshan Pius RegisterRpcMethod("request_roam_dbus", base::Bind(&RequestRoamDbus)); 548b1e4998befbb945b08a39801ddc89c45804406dfRoshan Pius RegisterRpcMethod("set_device_enabled", base::Bind(&SetDeviceEnabled)); 54960b85ccc30429df48f74cf055810561e01880203Roshan Pius RegisterRpcMethod("discover_tdls_link", base::Bind(&DiscoverTdlsLink)); 55060b85ccc30429df48f74cf055810561e01880203Roshan Pius RegisterRpcMethod("establish_tdls_link", base::Bind(&EstablishTdlsLink)); 55160b85ccc30429df48f74cf055810561e01880203Roshan Pius RegisterRpcMethod("query_tdls_link", base::Bind(&QueryTdlsLink)); 55251ac846707cf05933612cb111f173afec146c267Roshan Pius RegisterRpcMethod("add_wake_packet_source", base::Bind(&AddWakePacketSource)); 55351ac846707cf05933612cb111f173afec146c267Roshan Pius RegisterRpcMethod("remove_wake_packet_source", 55451ac846707cf05933612cb111f173afec146c267Roshan Pius base::Bind(&RemoveWakePacketSource)); 55551ac846707cf05933612cb111f173afec146c267Roshan Pius RegisterRpcMethod("remove_all_wake_packet_sources", 55651ac846707cf05933612cb111f173afec146c267Roshan Pius base::Bind(&RemoveAllWakePacketSources)); 557e6833dc3d92ce13a87b0c5c0926241025410d756Roshan Pius RegisterRpcMethod("sync_time_to", 558e6833dc3d92ce13a87b0c5c0926241025410d756Roshan Pius base::Bind(&SyncTimeTo)); 559e6833dc3d92ce13a87b0c5c0926241025410d756Roshan Pius RegisterRpcMethod("request_roam", 560e6833dc3d92ce13a87b0c5c0926241025410d756Roshan Pius base::Bind(&NotImplementedRpcMethod)); 561e6833dc3d92ce13a87b0c5c0926241025410d756Roshan Pius RegisterRpcMethod("enable_ui", 562e6833dc3d92ce13a87b0c5c0926241025410d756Roshan Pius base::Bind(&NotImplementedRpcMethod)); 563e6833dc3d92ce13a87b0c5c0926241025410d756Roshan Pius RegisterRpcMethod("do_suspend", 564e6833dc3d92ce13a87b0c5c0926241025410d756Roshan Pius base::Bind(&NotImplementedRpcMethod)); 565e6833dc3d92ce13a87b0c5c0926241025410d756Roshan Pius RegisterRpcMethod("do_suspend_bg", 566e6833dc3d92ce13a87b0c5c0926241025410d756Roshan Pius base::Bind(&NotImplementedRpcMethod)); 567e6833dc3d92ce13a87b0c5c0926241025410d756Roshan Pius RegisterRpcMethod("clear_supplicant_blacklist", 568e6833dc3d92ce13a87b0c5c0926241025410d756Roshan Pius base::Bind(&NotImplementedRpcMethod)); 569e6833dc3d92ce13a87b0c5c0926241025410d756Roshan Pius RegisterRpcMethod("ready", 570e6833dc3d92ce13a87b0c5c0926241025410d756Roshan Pius base::Bind(&NotImplementedRpcMethod)); 57156c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius 572ff0a5bfab9e361d818a7e14017523b9572bfd410Roshan Pius XmlRpc::XmlRpcServer::work(-1.0); 573dfde4dd62f7507a80ed7d9aa576ad795045f091fRoshan Pius} 574