1c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
2c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Copyright (C) 2015 The Android Open Source Project
3c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
4c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Licensed under the Apache License, Version 2.0 (the "License");
5c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// you may not use this file except in compliance with the License.
6c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// You may obtain a copy of the License at
7c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
8c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//      http://www.apache.org/licenses/LICENSE-2.0
9c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
10c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Unless required by applicable law or agreed to in writing, software
11c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// distributed under the License is distributed on an "AS IS" BASIS,
12c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// See the License for the specific language governing permissions and
14c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// limitations under the License.
15c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
1655ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
1755ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu#include "shill/dbus/chromeos_supplicant_interface_proxy.h"
1855ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
1955ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu#include <string>
2055ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
2155ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu#include <base/bind.h>
2255ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
2355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu#include "shill/logging.h"
2455ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu#include "shill/supplicant/supplicant_event_delegate_interface.h"
2555ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu#include "shill/supplicant/wpa_supplicant.h"
2655ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
2755ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiuusing std::string;
2855ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
2955ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiunamespace shill {
3055ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
3155ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiunamespace Logging {
3255ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiustatic auto kModuleLogScope = ScopeLogger::kDBus;
3355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiustatic string ObjectID(const dbus::ObjectPath* p) { return p->value(); }
3455ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu}
3555ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
36d0f54b608798f230eee2e79fd2130cae2f8e70cfPeter Qiuconst char ChromeosSupplicantInterfaceProxy::kInterfaceName[] =
37d0f54b608798f230eee2e79fd2130cae2f8e70cfPeter Qiu    "fi.w1.wpa_supplicant1.Interface";
3855ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiuconst char ChromeosSupplicantInterfaceProxy::kPropertyDisableHighBitrates[] =
3955ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    "DisableHighBitrates";
4055ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiuconst char ChromeosSupplicantInterfaceProxy::kPropertyFastReauth[] =
4155ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    "FastReauth";
4255ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiuconst char ChromeosSupplicantInterfaceProxy::kPropertyRoamThreshold[] =
4355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    "RoamThreshold";
4455ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiuconst char ChromeosSupplicantInterfaceProxy::kPropertyScan[] = "Scan";
4555ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiuconst char ChromeosSupplicantInterfaceProxy::kPropertyScanInterval[] =
4655ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    "ScanInterval";
4755ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiuconst char ChromeosSupplicantInterfaceProxy::kPropertySchedScan[] = "SchedScan";
4855ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
4955ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter QiuChromeosSupplicantInterfaceProxy::PropertySet::PropertySet(
5055ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    dbus::ObjectProxy* object_proxy,
5155ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    const std::string& interface_name,
5255ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    const PropertyChangedCallback& callback)
5355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    : dbus::PropertySet(object_proxy, interface_name, callback) {
5455ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  RegisterProperty(kPropertyDisableHighBitrates, &disable_high_bitrates);
5555ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  RegisterProperty(kPropertyFastReauth, &fast_reauth);
5655ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  RegisterProperty(kPropertyRoamThreshold, &roam_threshold);
5755ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  RegisterProperty(kPropertyScan, &scan);
5855ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  RegisterProperty(kPropertyScanInterval, &scan_interval);
5955ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  RegisterProperty(kPropertySchedScan, &sched_scan);
6055ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu}
6155ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
6255ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter QiuChromeosSupplicantInterfaceProxy::ChromeosSupplicantInterfaceProxy(
6355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    const scoped_refptr<dbus::Bus>& bus,
6455ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    const std::string& object_path,
6555ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    SupplicantEventDelegateInterface* delegate)
6655ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    : interface_proxy_(
6755ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu          new fi::w1::wpa_supplicant1::InterfaceProxy(
6855ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu              bus,
6955ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu              WPASupplicant::kDBusAddr,
7055ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu              dbus::ObjectPath(object_path))),
7155ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu      delegate_(delegate) {
72c34da84ef49b32c27c879c3d37831c7970a8538bPeter Qiu  // Register properites.
73c34da84ef49b32c27c879c3d37831c7970a8538bPeter Qiu  properties_.reset(
74c34da84ef49b32c27c879c3d37831c7970a8538bPeter Qiu      new PropertySet(
75c34da84ef49b32c27c879c3d37831c7970a8538bPeter Qiu          interface_proxy_->GetObjectProxy(),
76d0f54b608798f230eee2e79fd2130cae2f8e70cfPeter Qiu          kInterfaceName,
77c34da84ef49b32c27c879c3d37831c7970a8538bPeter Qiu          base::Bind(&ChromeosSupplicantInterfaceProxy::OnPropertyChanged,
78c34da84ef49b32c27c879c3d37831c7970a8538bPeter Qiu                     weak_factory_.GetWeakPtr())));
79c34da84ef49b32c27c879c3d37831c7970a8538bPeter Qiu
8055ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  // Register signal handlers.
8155ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  dbus::ObjectProxy::OnConnectedCallback on_connected_callback =
8255ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu      base::Bind(&ChromeosSupplicantInterfaceProxy::OnSignalConnected,
8355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu                 weak_factory_.GetWeakPtr());
8455ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  interface_proxy_->RegisterScanDoneSignalHandler(
8555ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu      base::Bind(&ChromeosSupplicantInterfaceProxy::ScanDone,
8655ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu                 weak_factory_.GetWeakPtr()),
8755ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu      on_connected_callback);
8855ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  interface_proxy_->RegisterBSSAddedSignalHandler(
8955ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu      base::Bind(&ChromeosSupplicantInterfaceProxy::BSSAdded,
9055ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu                 weak_factory_.GetWeakPtr()),
9155ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu      on_connected_callback);
9255ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  interface_proxy_->RegisterBSSRemovedSignalHandler(
9355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu      base::Bind(&ChromeosSupplicantInterfaceProxy::BSSRemoved,
9455ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu                 weak_factory_.GetWeakPtr()),
9555ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu      on_connected_callback);
9655ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  interface_proxy_->RegisterBlobAddedSignalHandler(
9755ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu      base::Bind(&ChromeosSupplicantInterfaceProxy::BlobAdded,
9855ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu                 weak_factory_.GetWeakPtr()),
9955ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu      on_connected_callback);
10055ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  interface_proxy_->RegisterBlobRemovedSignalHandler(
10155ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu      base::Bind(&ChromeosSupplicantInterfaceProxy::BlobRemoved,
10255ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu                 weak_factory_.GetWeakPtr()),
10355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu      on_connected_callback);
10455ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  interface_proxy_->RegisterCertificationSignalHandler(
10555ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu      base::Bind(&ChromeosSupplicantInterfaceProxy::Certification,
10655ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu                 weak_factory_.GetWeakPtr()),
10755ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu      on_connected_callback);
10855ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  interface_proxy_->RegisterEAPSignalHandler(
10955ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu      base::Bind(&ChromeosSupplicantInterfaceProxy::EAP,
11055ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu                 weak_factory_.GetWeakPtr()),
11155ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu      on_connected_callback);
11255ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  interface_proxy_->RegisterNetworkAddedSignalHandler(
11355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu      base::Bind(&ChromeosSupplicantInterfaceProxy::NetworkAdded,
11455ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu                 weak_factory_.GetWeakPtr()),
11555ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu      on_connected_callback);
11655ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  interface_proxy_->RegisterNetworkRemovedSignalHandler(
11755ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu      base::Bind(&ChromeosSupplicantInterfaceProxy::NetworkRemoved,
11855ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu                 weak_factory_.GetWeakPtr()),
11955ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu      on_connected_callback);
12055ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  interface_proxy_->RegisterNetworkSelectedSignalHandler(
12155ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu      base::Bind(&ChromeosSupplicantInterfaceProxy::NetworkSelected,
12255ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu                 weak_factory_.GetWeakPtr()),
12355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu      on_connected_callback);
12455ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  interface_proxy_->RegisterPropertiesChangedSignalHandler(
12555ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu      base::Bind(&ChromeosSupplicantInterfaceProxy::PropertiesChanged,
12655ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu                 weak_factory_.GetWeakPtr()),
12755ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu      on_connected_callback);
12855ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  interface_proxy_->RegisterTDLSDiscoverResponseSignalHandler(
12955ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu      base::Bind(&ChromeosSupplicantInterfaceProxy::TDLSDiscoverResponse,
13055ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu                 weak_factory_.GetWeakPtr()),
13155ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu      on_connected_callback);
13255ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
13355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  // Connect property signals and initialize cached values. Based on
13455ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  // recommendations from src/dbus/property.h.
13555ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  properties_->ConnectSignals();
13655ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  properties_->GetAll();
13755ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu}
13855ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
139a252f5be9870291e800ce2ffa1d6f6b4bbb32258Peter QiuChromeosSupplicantInterfaceProxy::~ChromeosSupplicantInterfaceProxy() {
140a252f5be9870291e800ce2ffa1d6f6b4bbb32258Peter Qiu  interface_proxy_->ReleaseObjectProxy(base::Bind(&base::DoNothing));
141a252f5be9870291e800ce2ffa1d6f6b4bbb32258Peter Qiu}
14255ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
14355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiubool ChromeosSupplicantInterfaceProxy::AddNetwork(const KeyValueStore& args,
14455ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu                                                  string* network) {
14555ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  SLOG(&interface_proxy_->GetObjectPath(), 2) << __func__;
14603e6719bae1e0903d94853b896673a033196bcf5Alex Vakulenko  brillo::VariantDictionary dict;
14755ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  KeyValueStore::ConvertToVariantDictionary(args, &dict);
14855ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  dbus::ObjectPath path;
14903e6719bae1e0903d94853b896673a033196bcf5Alex Vakulenko  brillo::ErrorPtr error;
15055ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  if (!interface_proxy_->AddNetwork(dict, &path, &error)) {
15155ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    LOG(ERROR) << "Failed to add network: "
15255ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu               << error->GetCode() << " " << error->GetMessage();
15355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    return false;
15455ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  }
1553b86eb2bd80b06ccf240368375e78718d94a3a7fPeter Qiu  *network = path.value();
15655ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  return true;
15755ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu}
15855ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
15955ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiubool ChromeosSupplicantInterfaceProxy::EnableHighBitrates() {
16055ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  SLOG(&interface_proxy_->GetObjectPath(), 2) << __func__;
16182847e0a551dc67e61e737c541704d734860e51dSamuel Tan#if !defined(__ANDROID__)
16203e6719bae1e0903d94853b896673a033196bcf5Alex Vakulenko  brillo::ErrorPtr error;
16355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  if (!interface_proxy_->EnableHighBitrates(&error)) {
16455ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    LOG(ERROR) << "Failed to enable high bitrates: "
16555ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu               << error->GetCode() << " " << error->GetMessage();
16655ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    return false;
16755ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  }
16882847e0a551dc67e61e737c541704d734860e51dSamuel Tan#endif  // __ANDROID__
16955ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  return true;
17055ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu}
17155ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
17255ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiubool ChromeosSupplicantInterfaceProxy::EAPLogoff() {
17355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  SLOG(&interface_proxy_->GetObjectPath(), 2) << __func__;
17403e6719bae1e0903d94853b896673a033196bcf5Alex Vakulenko  brillo::ErrorPtr error;
17555ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  if (!interface_proxy_->EAPLogoff(&error)) {
17655ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    LOG(ERROR) << "Failed to EPA logoff "
17755ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu               << error->GetCode() << " " << error->GetMessage();
17855ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    return false;
17955ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  }
18055ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  return true;
18155ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu}
18255ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
18355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiubool ChromeosSupplicantInterfaceProxy::EAPLogon() {
18455ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  SLOG(&interface_proxy_->GetObjectPath(), 2) << __func__;
18503e6719bae1e0903d94853b896673a033196bcf5Alex Vakulenko  brillo::ErrorPtr error;
18655ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  if (!interface_proxy_->EAPLogon(&error)) {
18755ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    LOG(ERROR) << "Failed to EAP logon: "
18855ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu               << error->GetCode() << " " << error->GetMessage();
18955ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    return false;
19055ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  }
19155ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  return true;
19255ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu}
19355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
19455ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiubool ChromeosSupplicantInterfaceProxy::Disconnect() {
19555ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  SLOG(&interface_proxy_->GetObjectPath(), 2) << __func__;
19603e6719bae1e0903d94853b896673a033196bcf5Alex Vakulenko  brillo::ErrorPtr error;
19755ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  if (!interface_proxy_->Disconnect(&error)) {
19855ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    LOG(ERROR) << "Failed to disconnect: "
19955ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu               << error->GetCode() << " " << error->GetMessage();
20055ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    return false;
20155ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  }
20255ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  return true;
20355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu}
20455ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
20555ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiubool ChromeosSupplicantInterfaceProxy::FlushBSS(const uint32_t& age) {
20655ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  SLOG(&interface_proxy_->GetObjectPath(), 2) << __func__;
20703e6719bae1e0903d94853b896673a033196bcf5Alex Vakulenko  brillo::ErrorPtr error;
20855ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  if (!interface_proxy_->FlushBSS(age, &error)) {
20955ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    LOG(ERROR) << "Failed to flush BSS: "
21055ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu               << error->GetCode() << " " << error->GetMessage();
21155ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    return false;
21255ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  }
21355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  return true;
21455ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu}
21555ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
21655ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiubool ChromeosSupplicantInterfaceProxy::NetworkReply(const string& network,
21755ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu                                                    const string& field,
21855ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu                                                    const string& value) {
21955ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  SLOG(&interface_proxy_->GetObjectPath(), 2) << __func__
22055ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu      << " network: " << network << " field: " << field << " value: " << value;
22103e6719bae1e0903d94853b896673a033196bcf5Alex Vakulenko  brillo::ErrorPtr error;
22255ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  if (!interface_proxy_->NetworkReply(dbus::ObjectPath(network),
22355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu                                      field,
22455ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu                                      value,
22555ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu                                      &error)) {
22655ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    LOG(ERROR) << "Failed to network reply: "
22755ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu               << error->GetCode() << " " << error->GetMessage();
22855ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    return false;
229d945aeaa7e5343049502e2e9a707b55008e78a11Ningyuan Wang  }
230d945aeaa7e5343049502e2e9a707b55008e78a11Ningyuan Wang  return true;
231d945aeaa7e5343049502e2e9a707b55008e78a11Ningyuan Wang}
232d945aeaa7e5343049502e2e9a707b55008e78a11Ningyuan Wang
233d945aeaa7e5343049502e2e9a707b55008e78a11Ningyuan Wangbool ChromeosSupplicantInterfaceProxy::Roam(const string& addr) {
234d945aeaa7e5343049502e2e9a707b55008e78a11Ningyuan Wang  SLOG(&interface_proxy_->GetObjectPath(), 2) << __func__;
23582847e0a551dc67e61e737c541704d734860e51dSamuel Tan#if !defined(__ANDROID__)
23603e6719bae1e0903d94853b896673a033196bcf5Alex Vakulenko  brillo::ErrorPtr error;
237d945aeaa7e5343049502e2e9a707b55008e78a11Ningyuan Wang  if (!interface_proxy_->Roam(addr, &error)) {
238d945aeaa7e5343049502e2e9a707b55008e78a11Ningyuan Wang    LOG(ERROR) << "Failed to Roam: "
239d945aeaa7e5343049502e2e9a707b55008e78a11Ningyuan Wang               << error->GetCode() << " " << error->GetMessage();
240d945aeaa7e5343049502e2e9a707b55008e78a11Ningyuan Wang    return false;
24155ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  }
24282847e0a551dc67e61e737c541704d734860e51dSamuel Tan#endif  // __ANDROID__
24355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  return true;
24455ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu}
24555ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
24655ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiubool ChromeosSupplicantInterfaceProxy::Reassociate() {
24755ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  SLOG(&interface_proxy_->GetObjectPath(), 2) << __func__;
24803e6719bae1e0903d94853b896673a033196bcf5Alex Vakulenko  brillo::ErrorPtr error;
24955ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  if (!interface_proxy_->Reassociate(&error)) {
25055ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    LOG(ERROR) << "Failed to reassociate: "
25155ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu               << error->GetCode() << " " << error->GetMessage();
25255ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    return false;
25355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  }
25455ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  return true;
25555ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu}
25655ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
25755ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiubool ChromeosSupplicantInterfaceProxy::Reattach() {
25855ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  SLOG(&interface_proxy_->GetObjectPath(), 2) << __func__;
25903e6719bae1e0903d94853b896673a033196bcf5Alex Vakulenko  brillo::ErrorPtr error;
26055ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  if (!interface_proxy_->Reattach(&error)) {
26155ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    LOG(ERROR) << "Failed to reattach: "
26255ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu               << error->GetCode() << " " << error->GetMessage();
26355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    return false;
26455ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  }
26555ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  return true;
26655ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu}
26755ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
26855ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiubool ChromeosSupplicantInterfaceProxy::RemoveAllNetworks() {
26955ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  SLOG(&interface_proxy_->GetObjectPath(), 2) << __func__;
27003e6719bae1e0903d94853b896673a033196bcf5Alex Vakulenko  brillo::ErrorPtr error;
27155ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  if (!interface_proxy_->RemoveAllNetworks(&error)) {
27255ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    LOG(ERROR) << "Failed to remove all networks: "
27355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu               << error->GetCode() << " " << error->GetMessage();
27455ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    return false;
27555ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  }
27655ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  return true;
27755ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu}
27855ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
27955ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiubool ChromeosSupplicantInterfaceProxy::RemoveNetwork(const string& network) {
28055ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  SLOG(&interface_proxy_->GetObjectPath(), 2) << __func__ << ": " << network;
28103e6719bae1e0903d94853b896673a033196bcf5Alex Vakulenko  brillo::ErrorPtr error;
28255ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  if (!interface_proxy_->RemoveNetwork(dbus::ObjectPath(network),
28355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu                                       &error)) {
28455ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    LOG(ERROR) << "Failed to remove network: "
28555ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu               << error->GetCode() << " " << error->GetMessage();
28655ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    // RemoveNetwork can fail with three different errors.
28755ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    //
28855ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    // If RemoveNetwork fails with a NetworkUnknown error, supplicant has
28955ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    // already removed the network object, so return true as if
29055ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    // RemoveNetwork removes the network object successfully.
29155ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    //
29255ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    // As shill always passes a valid network object path, RemoveNetwork
29355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    // should not fail with an InvalidArgs error. Return false in such case
29455ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    // as something weird may have happened. Similarly, return false in case
29555ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    // of an UnknownError.
29655ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    if (error->GetCode() != WPASupplicant::kErrorNetworkUnknown) {
29755ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu      return false;
29855ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    }
29955ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  }
30055ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  return true;
30155ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu}
30255ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
30355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiubool ChromeosSupplicantInterfaceProxy::Scan(const KeyValueStore& args) {
30455ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  SLOG(&interface_proxy_->GetObjectPath(), 2) << __func__;
30503e6719bae1e0903d94853b896673a033196bcf5Alex Vakulenko  brillo::VariantDictionary dict;
30655ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  KeyValueStore::ConvertToVariantDictionary(args, &dict);
30703e6719bae1e0903d94853b896673a033196bcf5Alex Vakulenko  brillo::ErrorPtr error;
30855ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  if (!interface_proxy_->Scan(dict, &error)) {
30955ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    LOG(ERROR) << "Failed to scan: "
31055ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu               << error->GetCode() << " " << error->GetMessage();
31155ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    return false;
31255ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  }
31355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  return true;
31455ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu}
31555ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
31655ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiubool ChromeosSupplicantInterfaceProxy::SelectNetwork(const string& network) {
31755ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  SLOG(&interface_proxy_->GetObjectPath(), 2) << __func__ << ": " << network;
31803e6719bae1e0903d94853b896673a033196bcf5Alex Vakulenko  brillo::ErrorPtr error;
31955ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  if (!interface_proxy_->SelectNetwork(dbus::ObjectPath(network), &error)) {
32055ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    LOG(ERROR) << "Failed to select network: "
32155ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu               << error->GetCode() << " " << error->GetMessage();
32255ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    return false;
32355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  }
32455ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  return true;
32555ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu}
32655ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
32755ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiubool ChromeosSupplicantInterfaceProxy::SetHT40Enable(const string& network,
32855ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu                                                     bool enable) {
32955ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  SLOG(&interface_proxy_->GetObjectPath(), 2) << __func__
33055ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu      << " network: " << network << " enable: " << enable;
33182847e0a551dc67e61e737c541704d734860e51dSamuel Tan#if defined(__ANDROID__)
33203e6719bae1e0903d94853b896673a033196bcf5Alex Vakulenko  brillo::ErrorPtr error;
33355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  if (!interface_proxy_->SetHT40Enable(dbus::ObjectPath(network),
33455ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu                                       enable,
33555ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu                                       &error)) {
33655ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    LOG(ERROR) << "Failed to set HT40 enable: "
33755ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu               << error->GetCode() << " " << error->GetMessage();
33855ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    return false;
33955ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  }
34082847e0a551dc67e61e737c541704d734860e51dSamuel Tan#endif  // __ANDROID__
34155ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  return true;
34255ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu}
34355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
34455ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiubool ChromeosSupplicantInterfaceProxy::TDLSDiscover(const string& peer) {
34555ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  SLOG(&interface_proxy_->GetObjectPath(), 2) << __func__ << ": " << peer;
34603e6719bae1e0903d94853b896673a033196bcf5Alex Vakulenko  brillo::ErrorPtr error;
34755ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  if (!interface_proxy_->TDLSDiscover(peer, &error)) {
34855ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    LOG(ERROR) << "Failed to perform TDLS discover: "
34955ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu               << error->GetCode() << " " << error->GetMessage();
35055ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    return false;
35155ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  }
35255ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  return true;
35355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu}
35455ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
35555ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiubool ChromeosSupplicantInterfaceProxy::TDLSSetup(const string& peer) {
35655ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  SLOG(&interface_proxy_->GetObjectPath(), 2) << __func__ << ": " << peer;
35703e6719bae1e0903d94853b896673a033196bcf5Alex Vakulenko  brillo::ErrorPtr error;
35855ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  if (!interface_proxy_->TDLSSetup(peer, &error)) {
35955ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    LOG(ERROR) << "Failed to perform TDLS setup: "
36055ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu               << error->GetCode() << " " << error->GetMessage();
36155ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    return false;
36255ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  }
36355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  return true;
36455ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu}
36555ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
36655ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiubool ChromeosSupplicantInterfaceProxy::TDLSStatus(const string& peer,
36755ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu                                                  string* status) {
36855ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  SLOG(&interface_proxy_->GetObjectPath(), 2) << __func__ << ": " << peer;
36903e6719bae1e0903d94853b896673a033196bcf5Alex Vakulenko  brillo::ErrorPtr error;
37055ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  if (!interface_proxy_->TDLSStatus(peer, status, &error)) {
37155ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    LOG(ERROR) << "Failed to retrieve TDLS status: "
37255ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu               << error->GetCode() << " " << error->GetMessage();
37355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    return false;
37455ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  }
37555ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  return true;
37655ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu}
37755ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
37855ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiubool ChromeosSupplicantInterfaceProxy::TDLSTeardown(const string& peer) {
37955ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  SLOG(&interface_proxy_->GetObjectPath(), 2) << __func__ << ": " << peer;
38003e6719bae1e0903d94853b896673a033196bcf5Alex Vakulenko  brillo::ErrorPtr error;
38155ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  if (!interface_proxy_->TDLSTeardown(peer, &error)) {
38255ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    LOG(ERROR) << "Failed to perform TDLS teardown: "
38355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu               << error->GetCode() << " " << error->GetMessage();
38455ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    return false;
38555ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  }
38655ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  return true;
38755ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu}
38855ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
38955ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiubool ChromeosSupplicantInterfaceProxy::SetFastReauth(bool enabled) {
39055ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  SLOG(&interface_proxy_->GetObjectPath(), 2) << __func__ << ": " << enabled;
39182847e0a551dc67e61e737c541704d734860e51dSamuel Tan#if !defined(__ANDROID__)
39210a17728a02d4f2178b1cb66dd4144604ad4668bPeter Qiu  if (!properties_->fast_reauth.SetAndBlock(enabled)) {
39310a17728a02d4f2178b1cb66dd4144604ad4668bPeter Qiu    LOG(ERROR) << __func__ << " failed: " << enabled;
39410a17728a02d4f2178b1cb66dd4144604ad4668bPeter Qiu    return false;
39510a17728a02d4f2178b1cb66dd4144604ad4668bPeter Qiu  }
39682847e0a551dc67e61e737c541704d734860e51dSamuel Tan#endif  // __ANDROID__
39755ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  return true;
39855ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu}
39955ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
40055ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiubool ChromeosSupplicantInterfaceProxy::SetRoamThreshold(uint16_t threshold) {
40155ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  SLOG(&interface_proxy_->GetObjectPath(), 2) << __func__ << ": " << threshold;
40282847e0a551dc67e61e737c541704d734860e51dSamuel Tan#if !defined(__ANDROID__)
40310a17728a02d4f2178b1cb66dd4144604ad4668bPeter Qiu  if (!properties_->roam_threshold.SetAndBlock(threshold)) {
40410a17728a02d4f2178b1cb66dd4144604ad4668bPeter Qiu    LOG(ERROR) << __func__ << " failed: " << threshold;
40510a17728a02d4f2178b1cb66dd4144604ad4668bPeter Qiu    return false;
40610a17728a02d4f2178b1cb66dd4144604ad4668bPeter Qiu  }
40782847e0a551dc67e61e737c541704d734860e51dSamuel Tan#endif  // __ANDROID__
40855ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  return true;
40955ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu}
41055ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
41155ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiubool ChromeosSupplicantInterfaceProxy::SetScanInterval(int32_t scan_interval) {
41255ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  SLOG(&interface_proxy_->GetObjectPath(), 2) << __func__ << ": "
41355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu      << scan_interval;
41482847e0a551dc67e61e737c541704d734860e51dSamuel Tan#if !defined(__ANDROID__)
41510a17728a02d4f2178b1cb66dd4144604ad4668bPeter Qiu  if (!properties_->scan_interval.SetAndBlock(scan_interval)) {
41610a17728a02d4f2178b1cb66dd4144604ad4668bPeter Qiu    LOG(ERROR) << __func__ << " failed: " << scan_interval;
41710a17728a02d4f2178b1cb66dd4144604ad4668bPeter Qiu    return false;
41810a17728a02d4f2178b1cb66dd4144604ad4668bPeter Qiu  }
41982847e0a551dc67e61e737c541704d734860e51dSamuel Tan#endif  // __ANDROID__
42055ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  return true;
42155ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu}
42255ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
42355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiubool ChromeosSupplicantInterfaceProxy::SetDisableHighBitrates(
42455ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    bool disable_high_bitrates) {
42555ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  SLOG(&interface_proxy_->GetObjectPath(), 2) << __func__ << ": "
42655ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu      << disable_high_bitrates;
42782847e0a551dc67e61e737c541704d734860e51dSamuel Tan#if !defined(__ANDROID__)
42810a17728a02d4f2178b1cb66dd4144604ad4668bPeter Qiu  if (!properties_->disable_high_bitrates.SetAndBlock(disable_high_bitrates)) {
42910a17728a02d4f2178b1cb66dd4144604ad4668bPeter Qiu    LOG(ERROR) << __func__ << " failed: " << disable_high_bitrates;
43010a17728a02d4f2178b1cb66dd4144604ad4668bPeter Qiu    return false;
43110a17728a02d4f2178b1cb66dd4144604ad4668bPeter Qiu  }
43282847e0a551dc67e61e737c541704d734860e51dSamuel Tan#endif  // __ANDROID__
43355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  return true;
43455ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu}
43555ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
43655ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiubool ChromeosSupplicantInterfaceProxy::SetSchedScan(bool enable) {
43755ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  SLOG(&interface_proxy_->GetObjectPath(), 2) << __func__ << ": " << enable;
43882847e0a551dc67e61e737c541704d734860e51dSamuel Tan#if !defined(__ANDROID__)
43910a17728a02d4f2178b1cb66dd4144604ad4668bPeter Qiu  if (!properties_->sched_scan.SetAndBlock(enable)) {
44010a17728a02d4f2178b1cb66dd4144604ad4668bPeter Qiu    LOG(ERROR) << __func__ << " failed: " << enable;
44110a17728a02d4f2178b1cb66dd4144604ad4668bPeter Qiu    return false;
44210a17728a02d4f2178b1cb66dd4144604ad4668bPeter Qiu  }
44382847e0a551dc67e61e737c541704d734860e51dSamuel Tan#endif  // __ANDROID__
44455ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  return true;
44555ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu}
44655ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
44755ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiubool ChromeosSupplicantInterfaceProxy::SetScan(bool enable) {
44855ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  SLOG(&interface_proxy_->GetObjectPath(), 2) << __func__ << ": " << enable;
44982847e0a551dc67e61e737c541704d734860e51dSamuel Tan#if !defined(__ANDROID__)
45010a17728a02d4f2178b1cb66dd4144604ad4668bPeter Qiu  if (!properties_->scan.SetAndBlock(enable)) {
45110a17728a02d4f2178b1cb66dd4144604ad4668bPeter Qiu    LOG(ERROR) << __func__ << " failed: " << enable;
45210a17728a02d4f2178b1cb66dd4144604ad4668bPeter Qiu    return false;
45310a17728a02d4f2178b1cb66dd4144604ad4668bPeter Qiu  }
45482847e0a551dc67e61e737c541704d734860e51dSamuel Tan#endif  // __ANDROID__
45555ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  return true;
45655ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu}
45755ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
45855ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiuvoid ChromeosSupplicantInterfaceProxy::BlobAdded(const string& /*blobname*/) {
45955ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  SLOG(&interface_proxy_->GetObjectPath(), 2) << __func__;
46055ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  // XXX
46155ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu}
46255ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
46355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiuvoid ChromeosSupplicantInterfaceProxy::BlobRemoved(const string& /*blobname*/) {
46455ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  SLOG(&interface_proxy_->GetObjectPath(), 2) << __func__;
46555ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  // XXX
46655ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu}
46755ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
46855ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiuvoid ChromeosSupplicantInterfaceProxy::BSSAdded(
46955ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    const dbus::ObjectPath& BSS,
47003e6719bae1e0903d94853b896673a033196bcf5Alex Vakulenko    const brillo::VariantDictionary& properties) {
47155ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  SLOG(&interface_proxy_->GetObjectPath(), 2) << __func__;
47255ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  KeyValueStore store;
47355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  KeyValueStore::ConvertFromVariantDictionary(properties, &store);
47455ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  delegate_->BSSAdded(BSS.value(), store);
47555ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu}
47655ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
47755ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiuvoid ChromeosSupplicantInterfaceProxy::Certification(
47803e6719bae1e0903d94853b896673a033196bcf5Alex Vakulenko    const brillo::VariantDictionary& properties) {
47955ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  SLOG(&interface_proxy_->GetObjectPath(), 2) << __func__;
48055ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  KeyValueStore store;
48155ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  KeyValueStore::ConvertFromVariantDictionary(properties, &store);
48255ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  delegate_->Certification(store);
48355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu}
48455ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
48555ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiuvoid ChromeosSupplicantInterfaceProxy::EAP(
48655ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    const string& status, const string& parameter) {
48755ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  SLOG(&interface_proxy_->GetObjectPath(), 2) << __func__ << ": status "
48855ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu      << status << ", parameter " << parameter;
48955ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  delegate_->EAPEvent(status, parameter);
49055ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu}
49155ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
49255ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiuvoid ChromeosSupplicantInterfaceProxy::BSSRemoved(const dbus::ObjectPath& BSS) {
49355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  SLOG(&interface_proxy_->GetObjectPath(), 2) << __func__;
49455ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  delegate_->BSSRemoved(BSS.value());
49555ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu}
49655ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
49755ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiuvoid ChromeosSupplicantInterfaceProxy::NetworkAdded(
49855ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    const dbus::ObjectPath& /*network*/,
49903e6719bae1e0903d94853b896673a033196bcf5Alex Vakulenko    const brillo::VariantDictionary& /*properties*/) {
50055ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  SLOG(&interface_proxy_->GetObjectPath(), 2) << __func__;
50155ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  // XXX
50255ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu}
50355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
50455ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiuvoid ChromeosSupplicantInterfaceProxy::NetworkRemoved(
50555ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    const dbus::ObjectPath& /*network*/) {
50655ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  SLOG(&interface_proxy_->GetObjectPath(), 2) << __func__;
50755ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  // TODO(quiche): Pass this up to the delegate, so that it can clean its
50855ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  // rpcid_by_service_ map. crbug.com/207648
50955ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu}
51055ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
51155ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiuvoid ChromeosSupplicantInterfaceProxy::NetworkSelected(
51255ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    const dbus::ObjectPath& /*network*/) {
51355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  SLOG(&interface_proxy_->GetObjectPath(), 2) << __func__;
51455ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  // XXX
51555ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu}
51655ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
51755ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiuvoid ChromeosSupplicantInterfaceProxy::PropertiesChanged(
51803e6719bae1e0903d94853b896673a033196bcf5Alex Vakulenko    const brillo::VariantDictionary& properties) {
51955ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  SLOG(&interface_proxy_->GetObjectPath(), 2) << __func__;
52055ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  KeyValueStore store;
52155ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  KeyValueStore::ConvertFromVariantDictionary(properties, &store);
52255ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  delegate_->PropertiesChanged(store);
52355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu}
52455ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
52555ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiuvoid ChromeosSupplicantInterfaceProxy::ScanDone(bool success) {
52655ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  SLOG(&interface_proxy_->GetObjectPath(), 2) << __func__ << ": " << success;
52755ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  delegate_->ScanDone(success);
52855ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu}
52955ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
53055ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiuvoid ChromeosSupplicantInterfaceProxy::TDLSDiscoverResponse(
53155ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    const std::string& peer_address) {
53255ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  SLOG(&interface_proxy_->GetObjectPath(), 2) << __func__ << ": "
53355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu      << peer_address;
53455ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  delegate_->TDLSDiscoverResponse(peer_address);
53555ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu}
53655ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
53755ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiuvoid ChromeosSupplicantInterfaceProxy::OnPropertyChanged(
53855ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    const std::string& property_name) {
53955ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  SLOG(&interface_proxy_->GetObjectPath(), 2) << __func__ << ": "
54055ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu      << property_name;
54155ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu}
54255ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
54355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiuvoid ChromeosSupplicantInterfaceProxy::OnSignalConnected(
54455ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    const string& interface_name, const string& signal_name, bool success) {
54555ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  SLOG(&interface_proxy_->GetObjectPath(), 2) << __func__
54655ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu      << "interface: " << interface_name << " signal: " << signal_name
54755ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu      << "success: " << success;
54855ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  if (!success) {
54955ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu    LOG(ERROR) << "Failed to connect signal " << signal_name
55055ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu        << " to interface " << interface_name;
55155ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu  }
55255ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu}
55355ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu
55455ce0b668c0096a2a0ae2c6dfe154635e80b169cPeter Qiu}  // namespace shill
555