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(&params_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(&params_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(&params_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(&params_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