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/strings/string_number_conversions.h>
18
19 #include "proxy_dbus_shill_wifi_client.h"
20
21 namespace {
22 const int kRescanIntervalMilliseconds = 200;
23 const int kServiceDisconnectTimeoutMilliseconds = 5000;
24 const char kDefaultBgscanMethod[] = "default";
25 const char kDefaultProfileName[] = "default";
26 } // namespace
27
ProxyDbusShillWifiClient(scoped_refptr<dbus::Bus> dbus_bus)28 ProxyDbusShillWifiClient::ProxyDbusShillWifiClient(
29 scoped_refptr<dbus::Bus> dbus_bus) {
30 dbus_client_.reset(new ProxyDbusClient(dbus_bus));
31 }
32
SetLogging()33 bool ProxyDbusShillWifiClient::SetLogging() {
34 dbus_client_->SetLogging(ProxyDbusClient::TECHNOLOGY_WIFI);
35 return true;
36 }
37
RemoveAllWifiEntries()38 bool ProxyDbusShillWifiClient::RemoveAllWifiEntries() {
39 for (auto& profile_proxy : dbus_client_->GetProfileProxies()) {
40 brillo::Any property_value;
41 CHECK(dbus_client_->GetPropertyValueFromProfileProxy(
42 profile_proxy.get(), shill::kEntriesProperty, &property_value));
43 auto entry_ids = property_value.Get<std::vector<std::string>>();
44 for (const auto& entry_id : entry_ids) {
45 brillo::VariantDictionary entry_props;
46 if (profile_proxy->GetEntry(entry_id, &entry_props, nullptr)) {
47 if (entry_props[shill::kTypeProperty].Get<std::string>() ==
48 shill::kTypeWifi) {
49 profile_proxy->DeleteEntry(entry_id, nullptr);
50 }
51 }
52 }
53 }
54 return true;
55 }
56
ConfigureServiceByGuid(const std::string & guid,AutoConnectType autoconnect,const std::string & passphrase)57 bool ProxyDbusShillWifiClient::ConfigureServiceByGuid(
58 const std::string& guid,
59 AutoConnectType autoconnect,
60 const std::string& passphrase) {
61 brillo::VariantDictionary service_params;
62 if (guid.empty()) {
63 return false;
64 }
65 SetAutoConnectInServiceParams(autoconnect, &service_params);
66 if (!passphrase.empty()) {
67 service_params.insert(std::make_pair(
68 shill::kPassphraseProperty, brillo::Any(passphrase)));
69 }
70 return dbus_client_->ConfigureServiceByGuid(guid, service_params);
71 }
72
ConfigureWifiService(const std::string & ssid,const std::string & security,const brillo::VariantDictionary & security_params,bool save_credentials,StationType station_type,bool hidden_network,const std::string & guid,AutoConnectType autoconnect)73 bool ProxyDbusShillWifiClient::ConfigureWifiService(
74 const std::string& ssid,
75 const std::string& security,
76 const brillo::VariantDictionary& security_params,
77 bool save_credentials,
78 StationType station_type,
79 bool hidden_network,
80 const std::string& guid,
81 AutoConnectType autoconnect) {
82 brillo::VariantDictionary service_params;
83 // Create the configure params dictionary.
84 service_params.insert(std::make_pair(
85 shill::kTypeProperty, brillo::Any(std::string(shill::kTypeWifi))));
86 service_params.insert(std::make_pair(
87 shill::kWifiHiddenSsid, brillo::Any(hidden_network)));
88 service_params.insert(std::make_pair(
89 shill::kSSIDProperty, brillo::Any(ssid)));
90 service_params.insert(std::make_pair(
91 shill::kSecurityClassProperty, brillo::Any(security)));
92 service_params.insert(std::make_pair(
93 shill::kModeProperty, brillo::Any(GetModeFromStationType(station_type))));
94 SetAutoConnectInServiceParams(autoconnect, &service_params);
95 service_params.insert(security_params.begin(), security_params.end());
96 if (!guid.empty()) {
97 service_params.insert(std::make_pair(
98 shill::kGuidProperty, brillo::Any(guid)));
99 }
100 for (const auto& param: service_params) {
101 LOG(INFO) << __func__ << ". Param: " << param.first << "="
102 << param.second.TryGet<bool>() << ","
103 << param.second.TryGet<int>() << ","
104 << param.second.TryGet<std::string>() << ".";
105 }
106 return dbus_client_->ConfigureService(service_params);
107 }
108
ConnectToWifiNetwork(const std::string & ssid,const std::string & security,const brillo::VariantDictionary & security_params,bool save_credentials,StationType station_type,bool hidden_network,const std::string & guid,AutoConnectType autoconnect,long discovery_timeout_milliseconds,long association_timeout_milliseconds,long configuration_timeout_milliseconds,long * discovery_time_milliseconds,long * association_time_milliseconds,long * configuration_time_milliseconds,std::string * failure_reason)109 bool ProxyDbusShillWifiClient::ConnectToWifiNetwork(
110 const std::string& ssid,
111 const std::string& security,
112 const brillo::VariantDictionary& security_params,
113 bool save_credentials,
114 StationType station_type,
115 bool hidden_network,
116 const std::string& guid,
117 AutoConnectType autoconnect,
118 long discovery_timeout_milliseconds,
119 long association_timeout_milliseconds,
120 long configuration_timeout_milliseconds,
121 long* discovery_time_milliseconds,
122 long* association_time_milliseconds,
123 long* configuration_time_milliseconds,
124 std::string* failure_reason) {
125 *discovery_time_milliseconds = -1;
126 *association_time_milliseconds = -1;
127 *configuration_time_milliseconds = -1;
128 if (station_type != kStationTypeManaged &&
129 station_type != kStationTypeIBSS) {
130 *failure_reason = "FAIL(Invalid station type specified.)";
131 return false;
132 }
133 if (hidden_network && !ConfigureWifiService(
134 ssid, security, security_params, save_credentials, station_type,
135 hidden_network, guid,autoconnect)) {
136 *failure_reason = "FAIL(Failed to configure hidden SSID)";
137 return false;
138 }
139 brillo::VariantDictionary service_params;
140 service_params.insert(std::make_pair(
141 shill::kTypeProperty, brillo::Any(std::string(shill::kTypeWifi))));
142 service_params.insert(std::make_pair(
143 shill::kNameProperty, brillo::Any(ssid)));
144 service_params.insert(std::make_pair(
145 shill::kSecurityClassProperty, brillo::Any(security)));
146 service_params.insert(std::make_pair(
147 shill::kModeProperty, brillo::Any(GetModeFromStationType(station_type))));
148 for (const auto& param: service_params) {
149 LOG(INFO) << __func__ << ". Param: " << param.first << "="
150 << param.second.TryGet<bool>() << ","
151 << param.second.TryGet<int>() << ","
152 << param.second.TryGet<std::string>() << ".";
153 }
154 brillo::Any signal_strength;
155 auto service = dbus_client_->WaitForMatchingServiceProxy(
156 service_params, shill::kTypeWifi, discovery_timeout_milliseconds,
157 kRescanIntervalMilliseconds, discovery_time_milliseconds);
158 if (!service ||
159 !dbus_client_->GetPropertyValueFromServiceProxy(
160 service.get(), shill::kSignalStrengthProperty, &signal_strength) ||
161 (signal_strength.Get<uint8_t>() < 0)) {
162 *failure_reason = "FAIL(Discovery timed out)";
163 return false;
164 }
165
166 for (const auto& security_param : security_params) {
167 CHECK(service->SetProperty(security_param.first, security_param.second, nullptr));
168 }
169 if (!guid.empty()) {
170 CHECK(service->SetProperty(shill::kGuidProperty, brillo::Any(guid), nullptr));
171 }
172 if (autoconnect != kAutoConnectTypeUnspecified) {
173 CHECK(service->SetProperty(
174 shill::kAutoConnectProperty, brillo::Any(bool(autoconnect)), nullptr));
175 }
176
177 brillo::ErrorPtr error;
178 if (!service->Connect(&error) &&
179 error->GetCode() != shill::kErrorResultAlreadyConnected) {
180 *failure_reason = "FAIL(Failed to call connect)";
181 return false;
182 }
183
184 brillo::Any final_value;
185 std::vector<brillo::Any> associated_states = {
186 brillo::Any(std::string("configuration")),
187 brillo::Any(std::string("ready")),
188 brillo::Any(std::string("portal")),
189 brillo::Any(std::string("online")) };
190 if (!dbus_client_->WaitForServiceProxyPropertyValueIn(
191 service->GetObjectPath(), shill::kStateProperty, associated_states,
192 association_timeout_milliseconds, &final_value,
193 association_time_milliseconds)) {
194 *failure_reason = "FAIL(Association timed out)";
195 LOG(ERROR) << "FAIL(Association timed out). Final State: " <<
196 final_value.Get<std::string>();
197 return false;
198 }
199
200 std::vector<brillo::Any> configured_states = {
201 brillo::Any(std::string("ready")),
202 brillo::Any(std::string("portal")),
203 brillo::Any(std::string("online")) };
204 if (!dbus_client_->WaitForServiceProxyPropertyValueIn(
205 service->GetObjectPath(), shill::kStateProperty, configured_states,
206 configuration_timeout_milliseconds, nullptr,
207 configuration_time_milliseconds)) {
208 *failure_reason = "FAIL(Configuration timed out)";
209 LOG(ERROR) << "FAIL(Configuration timed out). Final State: " <<
210 final_value.Get<std::string>();
211 return false;
212 }
213
214 *failure_reason = "SUCCESS(Connection successful)";
215 return true;
216 }
217
DisconnectFromWifiNetwork(const std::string & ssid,long disconnect_timeout_milliseconds,long * disconnect_time_milliseconds,std::string * failure_reason)218 bool ProxyDbusShillWifiClient::DisconnectFromWifiNetwork(
219 const std::string& ssid,
220 long disconnect_timeout_milliseconds,
221 long* disconnect_time_milliseconds,
222 std::string* failure_reason) {
223 *disconnect_time_milliseconds = -1;
224 if (disconnect_timeout_milliseconds == 0) {
225 disconnect_timeout_milliseconds = kServiceDisconnectTimeoutMilliseconds;
226 }
227 brillo::VariantDictionary service_params;
228 service_params.insert(std::make_pair(
229 shill::kTypeProperty, brillo::Any(std::string(shill::kTypeWifi))));
230 service_params.insert(std::make_pair(
231 shill::kNameProperty, brillo::Any(ssid)));
232 std::unique_ptr<ServiceProxy> service =
233 dbus_client_->GetMatchingServiceProxy(service_params);
234 if (!service) {
235 *failure_reason = "FAIL(Service not found)";
236 return false;
237 }
238 if (!service->Disconnect(nullptr)) {
239 *failure_reason = "FAIL(Failed to call disconnect)";
240 return false;
241 }
242 brillo::Any final_value;
243 std::vector<brillo::Any> disconnect_states = {
244 brillo::Any(std::string("idle")) };
245 if (!dbus_client_->WaitForServiceProxyPropertyValueIn(
246 service->GetObjectPath(), shill::kStateProperty, disconnect_states,
247 disconnect_timeout_milliseconds, &final_value,
248 disconnect_time_milliseconds)) {
249 *failure_reason = "FAIL(Disconnection timed out)";
250 return false;
251 }
252
253 *failure_reason = "SUCCESS(Disconnection successful)";
254 return true;
255 }
256
ConfigureBgScan(const std::string & interface_name,const std::string & method_name,uint16_t short_interval,uint16_t long_interval,int signal_threshold)257 bool ProxyDbusShillWifiClient::ConfigureBgScan(
258 const std::string& interface_name,
259 const std::string& method_name,
260 uint16_t short_interval,
261 uint16_t long_interval,
262 int signal_threshold) {
263 brillo::VariantDictionary device_params;
264 device_params.insert(std::make_pair(
265 shill::kNameProperty, brillo::Any(interface_name)));
266 std::unique_ptr<DeviceProxy> device =
267 dbus_client_->GetMatchingDeviceProxy(device_params);
268 if (!device) {
269 return false;
270 }
271 bool is_success = true;
272 if (method_name == kDefaultBgscanMethod) {
273 is_success &= device->ClearProperty(shill::kBgscanMethodProperty, nullptr);
274 } else {
275 is_success &= device->SetProperty(
276 shill::kBgscanMethodProperty,
277 brillo::Any(method_name),
278 nullptr);
279 }
280 is_success &= device->SetProperty(
281 shill::kBgscanShortIntervalProperty,
282 brillo::Any(short_interval),
283 nullptr);
284 is_success &= device->SetProperty(
285 shill::kScanIntervalProperty,
286 brillo::Any(long_interval),
287 nullptr);
288 is_success &= device->SetProperty(
289 shill::kBgscanSignalThresholdProperty,
290 brillo::Any(signal_threshold),
291 nullptr);
292 return is_success;
293 }
294
GetActiveWifiSsids(std::vector<std::string> * ssids)295 bool ProxyDbusShillWifiClient::GetActiveWifiSsids(
296 std::vector<std::string>* ssids) {
297 for (auto& service : dbus_client_->GetServiceProxies()) {
298 brillo::Any service_type, signal_strength, ssid_hex;
299 std::vector<uint8_t> ssid_bytes;
300 brillo::VariantDictionary proxy_properties;
301 brillo::ErrorPtr error;
302 if (service->GetProperties(&proxy_properties, &error)) {
303 service_type = proxy_properties[shill::kTypeProperty];
304 signal_strength = proxy_properties[shill::kSignalStrengthProperty];
305 ssid_hex = proxy_properties[shill::kWifiHexSsid];
306 if ((service_type.TryGet<std::string>() == shill::kTypeWifi) &&
307 (signal_strength.TryGet<uint8_t>() > 0) &&
308 !ssid_hex.TryGet<std::string>().empty() &&
309 base::HexStringToBytes(ssid_hex.Get<std::string>(), &ssid_bytes)) {
310 ssids->emplace_back(std::string(ssid_bytes.begin(), ssid_bytes.end()));
311 }
312 } else {
313 // Ignore unknown object path errors since we might be using some proxies
314 // for objects which may have been destroyed since.
315 CHECK(error->GetCode() == ProxyDbusClient::kDbusErrorObjectUnknown);
316 }
317 }
318 return true;
319 }
320
WaitForServiceStates(const std::string & ssid,const std::vector<std::string> & expected_states,long wait_timeout_milliseconds,std::string * final_state,long * wait_time_milliseconds)321 bool ProxyDbusShillWifiClient::WaitForServiceStates(
322 const std::string& ssid,
323 const std::vector<std::string>& expected_states,
324 long wait_timeout_milliseconds,
325 std::string* final_state,
326 long* wait_time_milliseconds) {
327 *wait_time_milliseconds = -1;
328 brillo::VariantDictionary service_params;
329 service_params.insert(std::make_pair(
330 shill::kTypeProperty, brillo::Any(std::string(shill::kTypeWifi))));
331 service_params.insert(std::make_pair(
332 shill::kNameProperty, brillo::Any(ssid)));
333 long discovery_time_milliseconds;
334 auto service = dbus_client_->WaitForMatchingServiceProxy(
335 service_params, shill::kTypeWifi, wait_timeout_milliseconds,
336 kRescanIntervalMilliseconds, &discovery_time_milliseconds);
337 if (!service) {
338 *final_state = "unknown";
339 return false;
340 }
341 brillo::Any final_value;
342 std::vector<brillo::Any> expected_states_any;
343 for (auto& state : expected_states) {
344 expected_states_any.emplace_back(brillo::Any(state));
345 }
346 bool is_success =
347 dbus_client_->WaitForServiceProxyPropertyValueIn(
348 service->GetObjectPath(), shill::kStateProperty, expected_states_any,
349 wait_timeout_milliseconds - discovery_time_milliseconds,
350 &final_value, wait_time_milliseconds);
351 *wait_time_milliseconds += discovery_time_milliseconds;
352 *final_state = final_value.Get<std::string>();
353 return is_success;
354 }
355
CreateProfile(const std::string & profile_name)356 bool ProxyDbusShillWifiClient::CreateProfile(const std::string& profile_name) {
357 return dbus_client_->CreateProfile(profile_name);
358 }
359
PushProfile(const std::string & profile_name)360 bool ProxyDbusShillWifiClient::PushProfile(const std::string& profile_name) {
361 return dbus_client_->PushProfile(profile_name);
362 }
363
PopProfile(const std::string & profile_name)364 bool ProxyDbusShillWifiClient::PopProfile(const std::string& profile_name) {
365 if (profile_name.empty()) {
366 return dbus_client_->PopAnyProfile();
367 } else {
368 return dbus_client_->PopProfile(profile_name);
369 }
370 }
371
RemoveProfile(const std::string & profile_name)372 bool ProxyDbusShillWifiClient::RemoveProfile(const std::string& profile_name) {
373 return dbus_client_->RemoveProfile(profile_name);
374 }
375
CleanProfiles()376 bool ProxyDbusShillWifiClient::CleanProfiles() {
377 while (true) {
378 auto active_profile = dbus_client_->GetActiveProfileProxy();
379 brillo::Any profile_name;
380 if (!dbus_client_->GetPropertyValueFromProfileProxy(
381 active_profile.get(), shill::kNameProperty, &profile_name)) {
382 return false;
383 }
384 std::string profile_name_str = profile_name.Get<std::string>();
385 if (profile_name_str == kDefaultProfileName) {
386 return true;
387 }
388 dbus_client_->PopProfile(profile_name_str);
389 dbus_client_->RemoveProfile(profile_name_str);
390 }
391 return false;
392 }
393
DeleteEntriesForSsid(const std::string & ssid)394 bool ProxyDbusShillWifiClient::DeleteEntriesForSsid(const std::string& ssid) {
395 auto profiles = dbus_client_->GetProfileProxies();
396 for (auto& profile : profiles) {
397 brillo::Any property_value;
398 if (!dbus_client_->GetPropertyValueFromProfileProxy(
399 profile.get(), shill::kEntriesProperty, &property_value)) {
400 continue;
401 }
402 auto entry_ids = property_value.Get<std::vector<std::string>>();
403 for (const auto& entry_id : entry_ids) {
404 brillo::VariantDictionary entry_props;
405 if ((profile->GetEntry(entry_id, &entry_props, nullptr)) &&
406 (entry_props[shill::kNameProperty].Get<std::string>() == ssid)) {
407 profile->DeleteEntry(entry_id, nullptr);
408 }
409 }
410 }
411 return true;
412 }
413
ListControlledWifiInterfaces(std::vector<std::string> * interface_names)414 bool ProxyDbusShillWifiClient::ListControlledWifiInterfaces(
415 std::vector<std::string>* interface_names) {
416 for (auto& device : dbus_client_->GetDeviceProxies()) {
417 brillo::Any device_type;
418 brillo::Any device_name;
419 if (!dbus_client_->GetPropertyValueFromDeviceProxy(
420 device.get(), shill::kTypeProperty, &device_type)) {
421 return false;
422 }
423 if (device_type.Get<std::string>() == shill::kTypeWifi) {
424 if (!dbus_client_->GetPropertyValueFromDeviceProxy(
425 device.get(), shill::kNameProperty, &device_name)) {
426 return false;
427 }
428 interface_names->emplace_back(device_name.Get<std::string>());
429 }
430 }
431 return true;
432 }
433
Disconnect(const std::string & ssid)434 bool ProxyDbusShillWifiClient::Disconnect(const std::string& ssid) {
435 long disconnect_time_milliseconds;
436 std::string failure_reason;
437 return DisconnectFromWifiNetwork(
438 ssid, 0, &disconnect_time_milliseconds, &failure_reason);
439 }
440
GetServiceOrder(std::string * service_order)441 bool ProxyDbusShillWifiClient::GetServiceOrder(std::string* service_order) {
442 return dbus_client_->GetServiceOrder(service_order);
443 }
444
SetServiceOrder(const std::string & service_order)445 bool ProxyDbusShillWifiClient::SetServiceOrder(const std::string& service_order) {
446 return dbus_client_->SetServiceOrder(service_order);
447 }
448
GetServiceProperties(const std::string & ssid,brillo::VariantDictionary * properties)449 bool ProxyDbusShillWifiClient::GetServiceProperties(
450 const std::string& ssid,
451 brillo::VariantDictionary* properties) {
452 brillo::VariantDictionary service_params;
453 service_params.insert(std::make_pair(
454 shill::kTypeProperty, brillo::Any(std::string(shill::kTypeWifi))));
455 service_params.insert(std::make_pair(
456 shill::kNameProperty, brillo::Any(ssid)));
457 std::unique_ptr<ServiceProxy> service =
458 dbus_client_->GetMatchingServiceProxy(service_params);
459 if (!service) {
460 return false;
461 }
462 CHECK(service->GetProperties(properties, nullptr));
463 return true;
464 }
465
SetSchedScan(bool enable)466 bool ProxyDbusShillWifiClient::SetSchedScan(bool enable) {
467 return dbus_client_->SetSchedScan(enable);
468 }
469
GetPropertyOnDevice(const std::string & interface_name,const std::string & property_name,brillo::Any * property_value)470 bool ProxyDbusShillWifiClient::GetPropertyOnDevice(
471 const std::string& interface_name,
472 const std::string& property_name,
473 brillo::Any* property_value) {
474 brillo::VariantDictionary device_params;
475 device_params.insert(std::make_pair(
476 shill::kNameProperty, brillo::Any(interface_name)));
477 std::unique_ptr<DeviceProxy> device =
478 dbus_client_->GetMatchingDeviceProxy(device_params);
479 if (!device) {
480 return false;
481 }
482 return dbus_client_->GetPropertyValueFromDeviceProxy(
483 device.get(), property_name, property_value);
484 }
485
SetPropertyOnDevice(const std::string & interface_name,const std::string & property_name,const brillo::Any & property_value)486 bool ProxyDbusShillWifiClient::SetPropertyOnDevice(
487 const std::string& interface_name,
488 const std::string& property_name,
489 const brillo::Any& property_value) {
490 brillo::VariantDictionary device_params;
491 device_params.insert(std::make_pair(
492 shill::kNameProperty, brillo::Any(interface_name)));
493 std::unique_ptr<DeviceProxy> device =
494 dbus_client_->GetMatchingDeviceProxy(device_params);
495 if (!device) {
496 return false;
497 }
498 return device->SetProperty(
499 property_name, property_value, nullptr);
500 }
501
RequestRoam(const std::string & interface_name,const std::string & bssid)502 bool ProxyDbusShillWifiClient::RequestRoam(
503 const std::string& interface_name,
504 const std::string& bssid) {
505 brillo::VariantDictionary device_params;
506 device_params.insert(std::make_pair(
507 shill::kNameProperty, brillo::Any(interface_name)));
508 std::unique_ptr<DeviceProxy> device =
509 dbus_client_->GetMatchingDeviceProxy(device_params);
510 if (!device) {
511 return false;
512 }
513 return device->RequestRoam(bssid, nullptr);
514 }
515
SetDeviceEnabled(const std::string & interface_name,bool enable)516 bool ProxyDbusShillWifiClient::SetDeviceEnabled(
517 const std::string& interface_name,
518 bool enable) {
519 brillo::VariantDictionary device_params;
520 device_params.insert(std::make_pair(
521 shill::kNameProperty, brillo::Any(interface_name)));
522 std::unique_ptr<DeviceProxy> device =
523 dbus_client_->GetMatchingDeviceProxy(device_params);
524 if (!device) {
525 return false;
526 }
527 if (enable) {
528 return device->Enable(nullptr);
529 } else {
530 return device->Disable(nullptr);
531 }
532 }
533
DiscoverTdlsLink(const std::string & interface_name,const std::string & peer_mac_address)534 bool ProxyDbusShillWifiClient::DiscoverTdlsLink(
535 const std::string& interface_name,
536 const std::string& peer_mac_address) {
537 std::string out_params;
538 return PerformTdlsOperation(
539 interface_name, shill::kTDLSDiscoverOperation,
540 peer_mac_address, &out_params);
541 }
542
EstablishTdlsLink(const std::string & interface_name,const std::string & peer_mac_address)543 bool ProxyDbusShillWifiClient::EstablishTdlsLink(
544 const std::string& interface_name,
545 const std::string& peer_mac_address) {
546 std::string out_params;
547 return PerformTdlsOperation(
548 interface_name, shill::kTDLSSetupOperation,
549 peer_mac_address, &out_params);
550 }
551
QueryTdlsLink(const std::string & interface_name,const std::string & peer_mac_address,std::string * status)552 bool ProxyDbusShillWifiClient::QueryTdlsLink(
553 const std::string& interface_name,
554 const std::string& peer_mac_address,
555 std::string* status) {
556 return PerformTdlsOperation(
557 interface_name, shill::kTDLSStatusOperation,
558 peer_mac_address, status);
559 }
560
AddWakePacketSource(const std::string & interface_name,const std::string & source_ip_address)561 bool ProxyDbusShillWifiClient::AddWakePacketSource(
562 const std::string& interface_name,
563 const std::string& source_ip_address) {
564 brillo::VariantDictionary device_params;
565 device_params.insert(std::make_pair(
566 shill::kNameProperty, brillo::Any(interface_name)));
567 std::unique_ptr<DeviceProxy> device =
568 dbus_client_->GetMatchingDeviceProxy(device_params);
569 if (!device) {
570 return false;
571 }
572 return device->AddWakeOnPacketConnection(source_ip_address, nullptr);
573 }
574
RemoveWakePacketSource(const std::string & interface_name,const std::string & source_ip_address)575 bool ProxyDbusShillWifiClient::RemoveWakePacketSource(
576 const std::string& interface_name,
577 const std::string& source_ip_address) {
578 brillo::VariantDictionary device_params;
579 device_params.insert(std::make_pair(
580 shill::kNameProperty, brillo::Any(interface_name)));
581 std::unique_ptr<DeviceProxy> device =
582 dbus_client_->GetMatchingDeviceProxy(device_params);
583 if (!device) {
584 return false;
585 }
586 return device->RemoveWakeOnPacketConnection(source_ip_address, nullptr);
587 }
588
RemoveAllWakePacketSources(const std::string & interface_name)589 bool ProxyDbusShillWifiClient::RemoveAllWakePacketSources(
590 const std::string& interface_name) {
591 brillo::VariantDictionary device_params;
592 device_params.insert(std::make_pair(
593 shill::kNameProperty, brillo::Any(interface_name)));
594 std::unique_ptr<DeviceProxy> device =
595 dbus_client_->GetMatchingDeviceProxy(device_params);
596 if (!device) {
597 return false;
598 }
599 return device->RemoveAllWakeOnPacketConnections(nullptr);
600 }
601
SetAutoConnectInServiceParams(AutoConnectType autoconnect,brillo::VariantDictionary * service_params)602 void ProxyDbusShillWifiClient::SetAutoConnectInServiceParams(
603 AutoConnectType autoconnect,
604 brillo::VariantDictionary* service_params) {
605 if (autoconnect != kAutoConnectTypeUnspecified) {
606 service_params->insert(std::make_pair(
607 shill::kAutoConnectProperty,
608 brillo::Any(static_cast<bool>(autoconnect))));
609 }
610 }
611
PerformTdlsOperation(const std::string & interface_name,const std::string & operation,const std::string & peer_mac_address,std::string * out_params)612 bool ProxyDbusShillWifiClient::PerformTdlsOperation(
613 const std::string& interface_name,
614 const std::string& operation,
615 const std::string& peer_mac_address,
616 std::string* out_params) {
617 brillo::VariantDictionary device_params;
618 device_params.insert(std::make_pair(
619 shill::kNameProperty, brillo::Any(interface_name)));
620 std::unique_ptr<DeviceProxy> device =
621 dbus_client_->GetMatchingDeviceProxy(device_params);
622 if (!device) {
623 return false;
624 }
625 return device->PerformTDLSOperation(
626 operation, peer_mac_address, out_params, nullptr);
627 }
628