1 //
2 // Copyright (C) 2015 The Android Open Source Project
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 //      http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16 
17 #include <base/bind.h>
18 
19 #include "proxy_rpc_in_data_types.h"
20 #include "proxy_rpc_out_data_types.h"
21 #include "proxy_rpc_server.h"
22 #include "proxy_util.h"
23 
24 namespace {
25 // XmlRpc library verbosity level.
26 static const int kDefaultXmlRpcVerbosity = 5;
27 // Profile name to be used for all the tests.
28 static const char kTestProfileName[] = "test";
29 
ValidateNumOfElements(const XmlRpc::XmlRpcValue & value,int expected_num)30 bool ValidateNumOfElements(const XmlRpc::XmlRpcValue& value, int expected_num) {
31   if (expected_num != 0) {
32     return (value.valid() && value.size() == expected_num);
33   } else {
34     // |value| will be marked invalid when there are no elements.
35     return !value.valid();
36   }
37 }
38 }// namespace
39 
40 /*************** RPC Method implementations **********/
CreateProfile(XmlRpc::XmlRpcValue params_in,ProxyShillWifiClient * shill_wifi_client)41 XmlRpc::XmlRpcValue CreateProfile(
42     XmlRpc::XmlRpcValue params_in,
43     ProxyShillWifiClient* shill_wifi_client) {
44   if (!ValidateNumOfElements(params_in, 1)) {
45     return false;
46   }
47   const std::string& profile_name(params_in[0]);
48   return shill_wifi_client->CreateProfile(profile_name);
49 }
50 
RemoveProfile(XmlRpc::XmlRpcValue params_in,ProxyShillWifiClient * shill_wifi_client)51 XmlRpc::XmlRpcValue RemoveProfile(
52     XmlRpc::XmlRpcValue params_in,
53     ProxyShillWifiClient* shill_wifi_client) {
54   if (!ValidateNumOfElements(params_in, 1)) {
55     return false;
56   }
57   const std::string& profile_name(params_in[0]);
58   return shill_wifi_client->RemoveProfile(profile_name);
59 }
60 
PushProfile(XmlRpc::XmlRpcValue params_in,ProxyShillWifiClient * shill_wifi_client)61 XmlRpc::XmlRpcValue PushProfile(
62     XmlRpc::XmlRpcValue params_in,
63     ProxyShillWifiClient* shill_wifi_client) {
64   if (!ValidateNumOfElements(params_in, 1)) {
65     return false;
66   }
67   const std::string& profile_name(params_in[0]);
68   return shill_wifi_client->PushProfile(profile_name);
69 }
70 
PopProfile(XmlRpc::XmlRpcValue params_in,ProxyShillWifiClient * shill_wifi_client)71 XmlRpc::XmlRpcValue PopProfile(
72     XmlRpc::XmlRpcValue params_in,
73     ProxyShillWifiClient* shill_wifi_client) {
74   if (!ValidateNumOfElements(params_in, 1)) {
75     return false;
76   }
77   const std::string& profile_name(params_in[0]);
78   return shill_wifi_client->PopProfile(profile_name);
79 }
80 
CleanProfiles(XmlRpc::XmlRpcValue params_in,ProxyShillWifiClient * shill_wifi_client)81 XmlRpc::XmlRpcValue CleanProfiles(
82     XmlRpc::XmlRpcValue params_in,
83     ProxyShillWifiClient* shill_wifi_client) {
84   if (!ValidateNumOfElements(params_in, 0)) {
85     return false;
86   }
87   return shill_wifi_client->CleanProfiles();
88 }
89 
ConfigureServiceByGuid(XmlRpc::XmlRpcValue params_in,ProxyShillWifiClient * shill_wifi_client)90 XmlRpc::XmlRpcValue ConfigureServiceByGuid(
91     XmlRpc::XmlRpcValue params_in,
92     ProxyShillWifiClient* shill_wifi_client) {
93   if (!ValidateNumOfElements(params_in, 1)) {
94     return false;
95   }
96   ConfigureServiceParameters config_params(&params_in[0]);
97   return shill_wifi_client->ConfigureServiceByGuid(
98       config_params.guid_,
99       config_params.autoconnect_type_,
100       config_params.passphrase_);
101 }
102 
ConfigureWifiService(XmlRpc::XmlRpcValue params_in,ProxyShillWifiClient * shill_wifi_client)103 XmlRpc::XmlRpcValue ConfigureWifiService(
104     XmlRpc::XmlRpcValue params_in,
105     ProxyShillWifiClient* shill_wifi_client) {
106   if (!ValidateNumOfElements(params_in, 1)) {
107     return false;
108   }
109   AssociationParameters assoc_params(&params_in[0]);
110   brillo::VariantDictionary security_params;
111   assoc_params.security_config_->GetServiceProperties(&security_params);
112   return shill_wifi_client->ConfigureWifiService(
113       assoc_params.ssid_,
114       assoc_params.security_config_->security_,
115       security_params,
116       assoc_params.save_credentials_,
117       assoc_params.station_type_,
118       assoc_params.is_hidden_,
119       assoc_params.guid_,
120       assoc_params.autoconnect_type_);
121 }
122 
ConnectWifi(XmlRpc::XmlRpcValue params_in,ProxyShillWifiClient * shill_wifi_client)123 XmlRpc::XmlRpcValue ConnectWifi(
124     XmlRpc::XmlRpcValue params_in,
125     ProxyShillWifiClient* shill_wifi_client) {
126   if (!ValidateNumOfElements(params_in, 1)) {
127     return false;
128   }
129 
130   AssociationParameters assoc_params(&params_in[0]);
131   std::string wifi_interface = assoc_params.bgscan_config_->interface_;
132   if (wifi_interface.empty()) {
133     std::vector<std::string> interfaces;
134     if (!shill_wifi_client->ListControlledWifiInterfaces(&interfaces) ||
135         interfaces.empty()) {
136       return false;
137     }
138     wifi_interface = interfaces[0];
139   }
140   shill_wifi_client->ConfigureBgScan(
141       wifi_interface,
142       assoc_params.bgscan_config_->method_,
143       assoc_params.bgscan_config_->short_interval_,
144       assoc_params.bgscan_config_->long_interval_,
145       assoc_params.bgscan_config_->signal_threshold_);
146 
147   brillo::VariantDictionary security_params;
148   assoc_params.security_config_->GetServiceProperties(&security_params);
149 
150   long discovery_time, association_time, configuration_time;
151   std::string failure_reason;
152   bool is_success = shill_wifi_client->ConnectToWifiNetwork(
153       assoc_params.ssid_,
154       assoc_params.security_config_->security_,
155       security_params,
156       assoc_params.save_credentials_,
157       assoc_params.station_type_,
158       assoc_params.is_hidden_,
159       assoc_params.guid_,
160       assoc_params.autoconnect_type_,
161       GetMillisecondsFromSeconds(assoc_params.discovery_timeout_seconds_),
162       GetMillisecondsFromSeconds(assoc_params.association_timeout_seconds_),
163       GetMillisecondsFromSeconds(assoc_params.configuration_timeout_seconds_),
164       &discovery_time,
165       &association_time,
166       &configuration_time,
167       &failure_reason);
168 
169   AssociationResult association_result(
170       is_success,
171       GetSecondsFromMilliseconds(discovery_time),
172       GetSecondsFromMilliseconds(association_time),
173       GetSecondsFromMilliseconds(configuration_time),
174       failure_reason);
175   return association_result.ConvertToXmlRpcValue();
176 }
177 
DeleteEntriesForSsid(XmlRpc::XmlRpcValue params_in,ProxyShillWifiClient * shill_wifi_client)178 XmlRpc::XmlRpcValue DeleteEntriesForSsid(
179     XmlRpc::XmlRpcValue params_in,
180     ProxyShillWifiClient* shill_wifi_client) {
181   if (!ValidateNumOfElements(params_in, 1)) {
182     return false;
183   }
184   const std::string& ssid(params_in[0]);
185   return shill_wifi_client->DeleteEntriesForSsid(ssid);
186 }
187 
InitTestNetworkState(XmlRpc::XmlRpcValue params_in,ProxyShillWifiClient * shill_wifi_client)188 XmlRpc::XmlRpcValue InitTestNetworkState(
189     XmlRpc::XmlRpcValue params_in,
190     ProxyShillWifiClient* shill_wifi_client) {
191   if (!ValidateNumOfElements(params_in, 0)) {
192     return false;
193   }
194   shill_wifi_client->SetLogging();
195   shill_wifi_client->CleanProfiles();
196   shill_wifi_client->RemoveAllWifiEntries();
197   shill_wifi_client->RemoveProfile(kTestProfileName);
198   bool is_success = shill_wifi_client->CreateProfile(kTestProfileName);
199   if (is_success) {
200     shill_wifi_client->PushProfile(kTestProfileName);
201   }
202   return is_success;
203 }
204 
ListControlledWifiInterfaces(XmlRpc::XmlRpcValue params_in,ProxyShillWifiClient * shill_wifi_client)205 XmlRpc::XmlRpcValue ListControlledWifiInterfaces(
206     XmlRpc::XmlRpcValue params_in,
207     ProxyShillWifiClient* shill_wifi_client) {
208   if (!ValidateNumOfElements(params_in, 0)) {
209     return false;
210   }
211   std::vector<std::string> interfaces;
212   if (!shill_wifi_client->ListControlledWifiInterfaces(&interfaces)) {
213     return false;
214   }
215   XmlRpc::XmlRpcValue result;
216   int array_pos = 0;
217   for (const auto& interface : interfaces) {
218     result[array_pos++] = interface;
219   }
220   return result;
221 }
222 
Disconnect(XmlRpc::XmlRpcValue params_in,ProxyShillWifiClient * shill_wifi_client)223 XmlRpc::XmlRpcValue Disconnect(
224     XmlRpc::XmlRpcValue params_in,
225     ProxyShillWifiClient* shill_wifi_client) {
226   if (!ValidateNumOfElements(params_in, 1)) {
227     return false;
228   }
229   const std::string& ssid = params_in[0];
230   return shill_wifi_client->Disconnect(ssid);
231 }
232 
WaitForServiceStates(XmlRpc::XmlRpcValue params_in,ProxyShillWifiClient * shill_wifi_client)233 XmlRpc::XmlRpcValue WaitForServiceStates(
234     XmlRpc::XmlRpcValue params_in,
235     ProxyShillWifiClient* shill_wifi_client) {
236   if (!ValidateNumOfElements(params_in, 3)) {
237     return false;
238   }
239   const std::string& ssid(params_in[0]);
240   XmlRpc::XmlRpcValue states_as_xmlrpcvalue(params_in[1]);
241   int timeout(params_in[2]);
242   int num_states = states_as_xmlrpcvalue.size();
243   std::vector<std::string> states;
244   for (int array_pos = 0; array_pos < num_states; array_pos++) {
245     states.emplace_back(std::string(states_as_xmlrpcvalue[array_pos]));
246   }
247   std::string final_state;
248   long wait_time;
249   bool is_success = shill_wifi_client->WaitForServiceStates(
250     ssid, states, GetMillisecondsFromSeconds(timeout),
251     &final_state, &wait_time);
252   XmlRpc::XmlRpcValue result;
253   result[0] = is_success;
254   result[1] = final_state;
255   result[2] = GetSecondsFromMilliseconds(wait_time);
256   return result;
257 }
258 
GetServiceOrder(XmlRpc::XmlRpcValue params_in,ProxyShillWifiClient * shill_wifi_client)259 XmlRpc::XmlRpcValue GetServiceOrder(
260     XmlRpc::XmlRpcValue params_in,
261     ProxyShillWifiClient* shill_wifi_client) {
262   if (!ValidateNumOfElements(params_in, 0)) {
263     return false;
264   }
265   std::string order;
266   if (!shill_wifi_client->GetServiceOrder(&order)) {
267     return false;
268   }
269   return order;
270 }
271 
SetServiceOrder(XmlRpc::XmlRpcValue params_in,ProxyShillWifiClient * shill_wifi_client)272 XmlRpc::XmlRpcValue SetServiceOrder(
273     XmlRpc::XmlRpcValue params_in,
274     ProxyShillWifiClient* shill_wifi_client) {
275   if (!ValidateNumOfElements(params_in, 1)) {
276     return false;
277   }
278   const std::string& order(params_in[0]);
279   return shill_wifi_client->SetServiceOrder(order);
280 }
281 
GetServiceProperties(XmlRpc::XmlRpcValue params_in,ProxyShillWifiClient * shill_wifi_client)282 XmlRpc::XmlRpcValue GetServiceProperties(
283     XmlRpc::XmlRpcValue params_in,
284     ProxyShillWifiClient* shill_wifi_client) {
285   if (!ValidateNumOfElements(params_in, 1)) {
286     return false;
287   }
288   const std::string& ssid(params_in[0]);
289   brillo::VariantDictionary properties;
290   if (!shill_wifi_client->GetServiceProperties(ssid, &properties)) {
291     return false;
292   }
293   XmlRpc::XmlRpcValue result;
294   GetXmlRpcValueFromBrilloAnyValue(properties, &result);
295   return result;
296 }
297 
GetActiveWifiSsids(XmlRpc::XmlRpcValue params_in,ProxyShillWifiClient * shill_wifi_client)298 XmlRpc::XmlRpcValue GetActiveWifiSsids(
299     XmlRpc::XmlRpcValue params_in,
300     ProxyShillWifiClient* shill_wifi_client) {
301   if (!ValidateNumOfElements(params_in, 0)) {
302     return false;
303   }
304   std::vector<std::string> ssids;
305   if (!shill_wifi_client->GetActiveWifiSsids(&ssids)) {
306     return false;
307   }
308   XmlRpc::XmlRpcValue result;
309   int array_pos = 0;
310   for (const auto& ssid : ssids) {
311     result[array_pos++] = ssid;
312   }
313   return result;
314 }
315 
SetSchedScan(XmlRpc::XmlRpcValue params_in,ProxyShillWifiClient * shill_wifi_client)316 XmlRpc::XmlRpcValue SetSchedScan(
317     XmlRpc::XmlRpcValue params_in,
318     ProxyShillWifiClient* shill_wifi_client) {
319   if (!ValidateNumOfElements(params_in, 1)) {
320     return false;
321   }
322   bool enable(params_in[0]);
323   return shill_wifi_client->SetSchedScan(enable);
324 }
325 
GetDbusPropertyOnDevice(XmlRpc::XmlRpcValue params_in,ProxyShillWifiClient * shill_wifi_client)326 XmlRpc::XmlRpcValue GetDbusPropertyOnDevice(
327     XmlRpc::XmlRpcValue params_in,
328     ProxyShillWifiClient* shill_wifi_client) {
329   if (!ValidateNumOfElements(params_in, 2)) {
330     return false;
331   }
332   const std::string& interface_name(params_in[0]);
333   const std::string& property_name(params_in[1]);
334   brillo::Any property_value;
335   if (!shill_wifi_client->GetPropertyOnDevice(
336           interface_name, property_name, &property_value)) {
337     return false;
338   }
339   XmlRpc::XmlRpcValue result;
340   GetXmlRpcValueFromBrilloAnyValue(property_value, &result);
341   return result;
342 }
343 
SetDbusPropertyOnDevice(XmlRpc::XmlRpcValue params_in,ProxyShillWifiClient * shill_wifi_client)344 XmlRpc::XmlRpcValue SetDbusPropertyOnDevice(
345     XmlRpc::XmlRpcValue params_in,
346     ProxyShillWifiClient* shill_wifi_client) {
347   if (!ValidateNumOfElements(params_in, 3)) {
348     return false;
349   }
350   const std::string& interface_name(params_in[0]);
351   const std::string& property_name(params_in[1]);
352   brillo::Any property_value;
353   GetBrilloAnyValueFromXmlRpcValue(&params_in[2], &property_value);
354   return shill_wifi_client->SetPropertyOnDevice(
355       interface_name, property_name, property_value);
356 }
357 
RequestRoamDbus(XmlRpc::XmlRpcValue params_in,ProxyShillWifiClient * shill_wifi_client)358 XmlRpc::XmlRpcValue RequestRoamDbus(
359     XmlRpc::XmlRpcValue params_in,
360     ProxyShillWifiClient* shill_wifi_client) {
361   if (!ValidateNumOfElements(params_in, 2)) {
362     return false;
363   }
364   const std::string& bssid(params_in[0]);
365   const std::string& interface_name(params_in[1]);
366   // |interface_name| is the first argument in ProxyShillWifiClient method
367   // to keep it symmetric with other methods defined in the interface even
368   // though it is reversed in the RPC call.
369   return shill_wifi_client->RequestRoam(interface_name, bssid);
370 }
371 
SetDeviceEnabled(XmlRpc::XmlRpcValue params_in,ProxyShillWifiClient * shill_wifi_client)372 XmlRpc::XmlRpcValue SetDeviceEnabled(
373     XmlRpc::XmlRpcValue params_in,
374     ProxyShillWifiClient* shill_wifi_client) {
375   if (!ValidateNumOfElements(params_in, 2)) {
376     return false;
377   }
378   const std::string& interface_name(params_in[0]);
379   bool enable(params_in[1]);
380   return shill_wifi_client->SetDeviceEnabled(interface_name, enable);
381 }
382 
DiscoverTdlsLink(XmlRpc::XmlRpcValue params_in,ProxyShillWifiClient * shill_wifi_client)383 XmlRpc::XmlRpcValue DiscoverTdlsLink(
384     XmlRpc::XmlRpcValue params_in,
385     ProxyShillWifiClient* shill_wifi_client) {
386   if (!ValidateNumOfElements(params_in, 2)) {
387     return false;
388   }
389   const std::string& interface_name(params_in[0]);
390   const std::string& peer_mac_address(params_in[1]);
391   return shill_wifi_client->DiscoverTdlsLink(interface_name, peer_mac_address);
392 }
393 
EstablishTdlsLink(XmlRpc::XmlRpcValue params_in,ProxyShillWifiClient * shill_wifi_client)394 XmlRpc::XmlRpcValue EstablishTdlsLink(
395     XmlRpc::XmlRpcValue params_in,
396     ProxyShillWifiClient* shill_wifi_client) {
397   if (!ValidateNumOfElements(params_in, 2)) {
398     return false;
399   }
400   const std::string& interface_name(params_in[0]);
401   const std::string& peer_mac_address(params_in[1]);
402   return shill_wifi_client->EstablishTdlsLink(interface_name, peer_mac_address);
403 }
404 
QueryTdlsLink(XmlRpc::XmlRpcValue params_in,ProxyShillWifiClient * shill_wifi_client)405 XmlRpc::XmlRpcValue QueryTdlsLink(
406     XmlRpc::XmlRpcValue params_in,
407     ProxyShillWifiClient* shill_wifi_client) {
408   if (!ValidateNumOfElements(params_in, 2)) {
409     return false;
410   }
411   const std::string& interface_name(params_in[0]);
412   const std::string& peer_mac_address(params_in[1]);
413   std::string status;
414   if (!shill_wifi_client->QueryTdlsLink(
415           interface_name, peer_mac_address, &status)) {
416     return false;
417   }
418   return status;
419 }
420 
AddWakePacketSource(XmlRpc::XmlRpcValue params_in,ProxyShillWifiClient * shill_wifi_client)421 XmlRpc::XmlRpcValue AddWakePacketSource(
422     XmlRpc::XmlRpcValue params_in,
423     ProxyShillWifiClient* shill_wifi_client) {
424   if (!ValidateNumOfElements(params_in, 2)) {
425     return false;
426   }
427   const std::string& interface_name(params_in[0]);
428   const std::string& source_ip(params_in[1]);
429   return shill_wifi_client->AddWakePacketSource(interface_name, source_ip);
430 }
431 
RemoveWakePacketSource(XmlRpc::XmlRpcValue params_in,ProxyShillWifiClient * shill_wifi_client)432 XmlRpc::XmlRpcValue RemoveWakePacketSource(
433     XmlRpc::XmlRpcValue params_in,
434     ProxyShillWifiClient* shill_wifi_client) {
435   if (!ValidateNumOfElements(params_in, 2)) {
436     return false;
437   }
438   const std::string& interface_name(params_in[0]);
439   const std::string& source_ip(params_in[1]);
440   return shill_wifi_client->RemoveWakePacketSource(interface_name, source_ip);
441 }
442 
RemoveAllWakePacketSources(XmlRpc::XmlRpcValue params_in,ProxyShillWifiClient * shill_wifi_client)443 XmlRpc::XmlRpcValue RemoveAllWakePacketSources(
444     XmlRpc::XmlRpcValue params_in,
445     ProxyShillWifiClient* shill_wifi_client) {
446   if (!ValidateNumOfElements(params_in, 1)) {
447     return false;
448   }
449   const std::string& interface_name(params_in[0]);
450   return shill_wifi_client->RemoveAllWakePacketSources(interface_name);
451 }
452 
SyncTimeTo(XmlRpc::XmlRpcValue params_in,ProxyShillWifiClient * shill_wifi_client)453 XmlRpc::XmlRpcValue SyncTimeTo(
454     XmlRpc::XmlRpcValue params_in,
455     ProxyShillWifiClient* shill_wifi_client) {
456   if (!ValidateNumOfElements(params_in, 1)) {
457     return false;
458   }
459   double epoch_seconds(params_in[0]);
460   double seconds;
461   double microseconds = modf(epoch_seconds, &seconds) * 1000000;
462   struct timeval tv;
463   tv.tv_sec = seconds;
464   tv.tv_usec = microseconds;
465   return settimeofday(&tv, nullptr);
466 }
467 
468 // Dummy method to be used for rpc methods not implemented yet.
NotImplementedRpcMethod(XmlRpc::XmlRpcValue params_in,ProxyShillWifiClient * shill_wifi_client)469 XmlRpc::XmlRpcValue NotImplementedRpcMethod(
470     XmlRpc::XmlRpcValue params_in,
471     ProxyShillWifiClient* shill_wifi_client) {
472   LOG(ERROR) << "RPC Method not implemented.";
473   return true;
474 }
475 
ProxyRpcServerMethod(const std::string & method_name,const RpcServerMethodHandler & handler,ProxyShillWifiClient * shill_wifi_client,ProxyRpcServer * server)476 ProxyRpcServerMethod::ProxyRpcServerMethod(
477     const std::string& method_name,
478     const RpcServerMethodHandler& handler,
479     ProxyShillWifiClient* shill_wifi_client,
480     ProxyRpcServer* server)
481   : XmlRpcServerMethod(method_name, server),
482     handler_(handler),
483     shill_wifi_client_(shill_wifi_client) {
484 }
485 
execute(XmlRpc::XmlRpcValue & params_in,XmlRpc::XmlRpcValue & value_out)486 void ProxyRpcServerMethod::execute(
487     XmlRpc::XmlRpcValue& params_in,
488     XmlRpc::XmlRpcValue& value_out) {
489   value_out = handler_.Run(params_in, shill_wifi_client_);
490 }
491 
help(void)492 std::string ProxyRpcServerMethod::help(void) {
493   // TODO: Lookup the method help using the |method_name| from
494   // a text file.
495   return "Shill Test Proxy RPC methods help.";
496 }
497 
ProxyRpcServer(int server_port,std::unique_ptr<ProxyShillWifiClient> shill_wifi_client)498 ProxyRpcServer::ProxyRpcServer(
499     int server_port,
500     std::unique_ptr<ProxyShillWifiClient> shill_wifi_client)
501   : XmlRpcServer(),
502     server_port_(server_port),
503     shill_wifi_client_(std::move(shill_wifi_client)) {
504 }
505 
RegisterRpcMethod(const std::string & method_name,const RpcServerMethodHandler & handler)506 void ProxyRpcServer::RegisterRpcMethod(
507     const std::string& method_name,
508     const RpcServerMethodHandler& handler) {
509   methods_.emplace_back(
510       new ProxyRpcServerMethod(
511           method_name, handler, shill_wifi_client_.get(), this));
512 }
513 
Run()514 void ProxyRpcServer::Run() {
515   XmlRpc::setVerbosity(kDefaultXmlRpcVerbosity);
516   if (!XmlRpc::XmlRpcServer::bindAndListen(server_port_)) {
517     LOG(ERROR) << "Failed to bind to port " << server_port_ << ".";
518     return;
519   }
520   XmlRpc::XmlRpcServer::enableIntrospection(true);
521 
522   RegisterRpcMethod("create_profile", base::Bind(&CreateProfile));
523   RegisterRpcMethod("remove_profile", base::Bind(&RemoveProfile));
524   RegisterRpcMethod("push_profile", base::Bind(&PushProfile));
525   RegisterRpcMethod("pop_profile", base::Bind(&PopProfile));
526   RegisterRpcMethod("clean_profiles", base::Bind(&CleanProfiles));
527   RegisterRpcMethod("configure_service_by_guid",
528                     base::Bind(&ConfigureServiceByGuid));
529   RegisterRpcMethod("configure_wifi_service", base::Bind(&ConfigureWifiService));
530   RegisterRpcMethod("connect_wifi", base::Bind(&ConnectWifi));
531   RegisterRpcMethod("delete_entries_for_ssid", base::Bind(&DeleteEntriesForSsid));
532   RegisterRpcMethod("init_test_network_state", base::Bind(&InitTestNetworkState));
533   RegisterRpcMethod("list_controlled_wifi_interfaces",
534                     base::Bind(&ListControlledWifiInterfaces));
535   RegisterRpcMethod("disconnect", base::Bind(&Disconnect));
536   RegisterRpcMethod("wait_for_service_states",
537                     base::Bind(&WaitForServiceStates));
538   RegisterRpcMethod("get_service_order", base::Bind(&GetServiceOrder));
539   RegisterRpcMethod("set_service_order", base::Bind(&SetServiceOrder));
540   RegisterRpcMethod("get_service_properties", base::Bind(&GetServiceProperties));
541   RegisterRpcMethod("get_active_wifi_SSIDs", base::Bind(&GetActiveWifiSsids));
542   RegisterRpcMethod("set_sched_scan", base::Bind(&SetSchedScan));
543   RegisterRpcMethod("get_dbus_property_on_device",
544                     base::Bind(&GetDbusPropertyOnDevice));
545   RegisterRpcMethod("set_dbus_property_on_device",
546                     base::Bind(&SetDbusPropertyOnDevice));
547   RegisterRpcMethod("request_roam_dbus", base::Bind(&RequestRoamDbus));
548   RegisterRpcMethod("set_device_enabled", base::Bind(&SetDeviceEnabled));
549   RegisterRpcMethod("discover_tdls_link", base::Bind(&DiscoverTdlsLink));
550   RegisterRpcMethod("establish_tdls_link", base::Bind(&EstablishTdlsLink));
551   RegisterRpcMethod("query_tdls_link", base::Bind(&QueryTdlsLink));
552   RegisterRpcMethod("add_wake_packet_source", base::Bind(&AddWakePacketSource));
553   RegisterRpcMethod("remove_wake_packet_source",
554                     base::Bind(&RemoveWakePacketSource));
555   RegisterRpcMethod("remove_all_wake_packet_sources",
556                     base::Bind(&RemoveAllWakePacketSources));
557   RegisterRpcMethod("sync_time_to",
558                     base::Bind(&SyncTimeTo));
559   RegisterRpcMethod("request_roam",
560                     base::Bind(&NotImplementedRpcMethod));
561   RegisterRpcMethod("enable_ui",
562                     base::Bind(&NotImplementedRpcMethod));
563   RegisterRpcMethod("do_suspend",
564                     base::Bind(&NotImplementedRpcMethod));
565   RegisterRpcMethod("do_suspend_bg",
566                     base::Bind(&NotImplementedRpcMethod));
567   RegisterRpcMethod("clear_supplicant_blacklist",
568                     base::Bind(&NotImplementedRpcMethod));
569   RegisterRpcMethod("ready",
570                     base::Bind(&NotImplementedRpcMethod));
571 
572   XmlRpc::XmlRpcServer::work(-1.0);
573 }
574