1326b6cfba5ab73c9e41a7585d1bc95871631122aPeter Qiu//
2326b6cfba5ab73c9e41a7585d1bc95871631122aPeter Qiu// Copyright (C) 2014 The Android Open Source Project
3326b6cfba5ab73c9e41a7585d1bc95871631122aPeter Qiu//
4326b6cfba5ab73c9e41a7585d1bc95871631122aPeter Qiu// Licensed under the Apache License, Version 2.0 (the "License");
5326b6cfba5ab73c9e41a7585d1bc95871631122aPeter Qiu// you may not use this file except in compliance with the License.
6326b6cfba5ab73c9e41a7585d1bc95871631122aPeter Qiu// You may obtain a copy of the License at
7326b6cfba5ab73c9e41a7585d1bc95871631122aPeter Qiu//
8326b6cfba5ab73c9e41a7585d1bc95871631122aPeter Qiu//      http://www.apache.org/licenses/LICENSE-2.0
9326b6cfba5ab73c9e41a7585d1bc95871631122aPeter Qiu//
10326b6cfba5ab73c9e41a7585d1bc95871631122aPeter Qiu// Unless required by applicable law or agreed to in writing, software
11326b6cfba5ab73c9e41a7585d1bc95871631122aPeter Qiu// distributed under the License is distributed on an "AS IS" BASIS,
12326b6cfba5ab73c9e41a7585d1bc95871631122aPeter Qiu// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13326b6cfba5ab73c9e41a7585d1bc95871631122aPeter Qiu// See the License for the specific language governing permissions and
14326b6cfba5ab73c9e41a7585d1bc95871631122aPeter Qiu// limitations under the License.
15326b6cfba5ab73c9e41a7585d1bc95871631122aPeter Qiu//
165dd242dfe5acf25696f877999320ac4164785a5Peter Qiu
175dd242dfe5acf25696f877999320ac4164785a5Peter Qiu#include "apmanager/manager.h"
185dd242dfe5acf25696f877999320ac4164785a5Peter Qiu
19376e40426ad6055adfb384240b6e9a5d732f06e5Peter Qiu#include <base/bind.h>
207a420d3e06aa7fb5eba305dc587624eb58bde7b7Peter Qiu
217758d8db3ddb2582fb57bda4a26c9f6f6bd20316Peter Qiu#include "apmanager/control_interface.h"
227758d8db3ddb2582fb57bda4a26c9f6f6bd20316Peter Qiu#include "apmanager/manager.h"
237758d8db3ddb2582fb57bda4a26c9f6f6bd20316Peter Qiu
24fb39ba4b2ef92f0c9d19f6910a350cd8a14405a0Peter Qiuusing std::string;
25376e40426ad6055adfb384240b6e9a5d732f06e5Peter Qiu
265dd242dfe5acf25696f877999320ac4164785a5Peter Qiunamespace apmanager {
275dd242dfe5acf25696f877999320ac4164785a5Peter Qiu
28f933540bb968efa2744ee48b40ab713ccd358d51Peter QiuManager::Manager(ControlInterface* control_interface)
297758d8db3ddb2582fb57bda4a26c9f6f6bd20316Peter Qiu    : control_interface_(control_interface),
30fb39ba4b2ef92f0c9d19f6910a350cd8a14405a0Peter Qiu      service_identifier_(0),
317758d8db3ddb2582fb57bda4a26c9f6f6bd20316Peter Qiu      device_info_(this),
327758d8db3ddb2582fb57bda4a26c9f6f6bd20316Peter Qiu      adaptor_(control_interface->CreateManagerAdaptor(this)) {}
335dd242dfe5acf25696f877999320ac4164785a5Peter Qiu
347758d8db3ddb2582fb57bda4a26c9f6f6bd20316Peter QiuManager::~Manager() {}
355dd242dfe5acf25696f877999320ac4164785a5Peter Qiu
360d70fa725563571fff9e91e7a86386d3d1db4667Peter Qiuvoid Manager::RegisterAsync(
370d70fa725563571fff9e91e7a86386d3d1db4667Peter Qiu    const base::Callback<void(bool)>& completion_callback) {
387758d8db3ddb2582fb57bda4a26c9f6f6bd20316Peter Qiu  adaptor_->RegisterAsync(completion_callback);
395dd242dfe5acf25696f877999320ac4164785a5Peter Qiu}
405dd242dfe5acf25696f877999320ac4164785a5Peter Qiu
41fb39ba4b2ef92f0c9d19f6910a350cd8a14405a0Peter Qiuvoid Manager::Start() {
427758d8db3ddb2582fb57bda4a26c9f6f6bd20316Peter Qiu  shill_manager_.Init(control_interface_);
437758d8db3ddb2582fb57bda4a26c9f6f6bd20316Peter Qiu  firewall_manager_.Init(control_interface_);
44fb39ba4b2ef92f0c9d19f6910a350cd8a14405a0Peter Qiu  device_info_.Start();
45fb39ba4b2ef92f0c9d19f6910a350cd8a14405a0Peter Qiu}
46fb39ba4b2ef92f0c9d19f6910a350cd8a14405a0Peter Qiu
47fb39ba4b2ef92f0c9d19f6910a350cd8a14405a0Peter Qiuvoid Manager::Stop() {
48fb39ba4b2ef92f0c9d19f6910a350cd8a14405a0Peter Qiu  device_info_.Stop();
49fb39ba4b2ef92f0c9d19f6910a350cd8a14405a0Peter Qiu}
50fb39ba4b2ef92f0c9d19f6910a350cd8a14405a0Peter Qiu
517758d8db3ddb2582fb57bda4a26c9f6f6bd20316Peter Qiuscoped_refptr<Service> Manager::CreateService() {
52fb39ba4b2ef92f0c9d19f6910a350cd8a14405a0Peter Qiu  LOG(INFO) << "Manager::CreateService";
537758d8db3ddb2582fb57bda4a26c9f6f6bd20316Peter Qiu  scoped_refptr<Service> service = new Service(this, service_identifier_++);
547758d8db3ddb2582fb57bda4a26c9f6f6bd20316Peter Qiu  services_.push_back(service);
557758d8db3ddb2582fb57bda4a26c9f6f6bd20316Peter Qiu  return service;
565dd242dfe5acf25696f877999320ac4164785a5Peter Qiu}
575dd242dfe5acf25696f877999320ac4164785a5Peter Qiu
587758d8db3ddb2582fb57bda4a26c9f6f6bd20316Peter Qiubool Manager::RemoveService(const scoped_refptr<Service>& service,
597758d8db3ddb2582fb57bda4a26c9f6f6bd20316Peter Qiu                            Error* error) {
60376e40426ad6055adfb384240b6e9a5d732f06e5Peter Qiu  for (auto it = services_.begin(); it != services_.end(); ++it) {
617758d8db3ddb2582fb57bda4a26c9f6f6bd20316Peter Qiu    if (*it == service) {
62376e40426ad6055adfb384240b6e9a5d732f06e5Peter Qiu      services_.erase(it);
63376e40426ad6055adfb384240b6e9a5d732f06e5Peter Qiu      return true;
64376e40426ad6055adfb384240b6e9a5d732f06e5Peter Qiu    }
65376e40426ad6055adfb384240b6e9a5d732f06e5Peter Qiu  }
66376e40426ad6055adfb384240b6e9a5d732f06e5Peter Qiu
677758d8db3ddb2582fb57bda4a26c9f6f6bd20316Peter Qiu  Error::PopulateAndLog(error,
687758d8db3ddb2582fb57bda4a26c9f6f6bd20316Peter Qiu                        Error::kInvalidArguments,
697758d8db3ddb2582fb57bda4a26c9f6f6bd20316Peter Qiu                        "Service does not exist",
707758d8db3ddb2582fb57bda4a26c9f6f6bd20316Peter Qiu                        FROM_HERE);
71f07317353daf54dcf33254f54e35a786fcc0fd03Peter Qiu  return false;
725dd242dfe5acf25696f877999320ac4164785a5Peter Qiu}
735dd242dfe5acf25696f877999320ac4164785a5Peter Qiu
74fb39ba4b2ef92f0c9d19f6910a350cd8a14405a0Peter Qiuscoped_refptr<Device> Manager::GetAvailableDevice() {
75fb39ba4b2ef92f0c9d19f6910a350cd8a14405a0Peter Qiu  for (const auto& device : devices_) {
768e785b9645b8d6f32f3e2cae8d7e2a7ec3c71e76Peter Qiu    // Look for an unused device with AP interface mode support.
770c0e9e72a5c6b1b6ef39ccff8b2aced8b3966256Garret Kelly    if (!device->GetInUse() && !device->GetPreferredApInterface().empty()) {
78fb39ba4b2ef92f0c9d19f6910a350cd8a14405a0Peter Qiu      return device;
79fb39ba4b2ef92f0c9d19f6910a350cd8a14405a0Peter Qiu    }
80fb39ba4b2ef92f0c9d19f6910a350cd8a14405a0Peter Qiu  }
81fb39ba4b2ef92f0c9d19f6910a350cd8a14405a0Peter Qiu  return nullptr;
82fb39ba4b2ef92f0c9d19f6910a350cd8a14405a0Peter Qiu}
83fb39ba4b2ef92f0c9d19f6910a350cd8a14405a0Peter Qiu
84fb39ba4b2ef92f0c9d19f6910a350cd8a14405a0Peter Qiuscoped_refptr<Device> Manager::GetDeviceFromInterfaceName(
85fb39ba4b2ef92f0c9d19f6910a350cd8a14405a0Peter Qiu    const string& interface_name) {
86fb39ba4b2ef92f0c9d19f6910a350cd8a14405a0Peter Qiu  for (const auto& device : devices_) {
87fb39ba4b2ef92f0c9d19f6910a350cd8a14405a0Peter Qiu    if (device->InterfaceExists(interface_name)) {
88fb39ba4b2ef92f0c9d19f6910a350cd8a14405a0Peter Qiu      return device;
89fb39ba4b2ef92f0c9d19f6910a350cd8a14405a0Peter Qiu    }
90fb39ba4b2ef92f0c9d19f6910a350cd8a14405a0Peter Qiu  }
91fb39ba4b2ef92f0c9d19f6910a350cd8a14405a0Peter Qiu  return nullptr;
92fb39ba4b2ef92f0c9d19f6910a350cd8a14405a0Peter Qiu}
93fb39ba4b2ef92f0c9d19f6910a350cd8a14405a0Peter Qiu
947758d8db3ddb2582fb57bda4a26c9f6f6bd20316Peter Qiuvoid Manager::RegisterDevice(const scoped_refptr<Device>& device) {
95fb39ba4b2ef92f0c9d19f6910a350cd8a14405a0Peter Qiu  LOG(INFO) << "Manager::RegisterDevice: registering device "
96fb39ba4b2ef92f0c9d19f6910a350cd8a14405a0Peter Qiu            << device->GetDeviceName();
97f933540bb968efa2744ee48b40ab713ccd358d51Peter Qiu  devices_.push_back(device);
98f933540bb968efa2744ee48b40ab713ccd358d51Peter Qiu  // TODO(zqiu): Property update for available devices.
99fb39ba4b2ef92f0c9d19f6910a350cd8a14405a0Peter Qiu}
100fb39ba4b2ef92f0c9d19f6910a350cd8a14405a0Peter Qiu
1017e0ffcf4e8d2fb05b2a57fc2127451ece8556cf5Peter Qiuvoid Manager::ClaimInterface(const string& interface_name) {
1022a6fb338dced5622d701da61c5ee06b3df7dbad7Peter Qiu  shill_manager_.ClaimInterface(interface_name);
1037e0ffcf4e8d2fb05b2a57fc2127451ece8556cf5Peter Qiu}
1047e0ffcf4e8d2fb05b2a57fc2127451ece8556cf5Peter Qiu
1057e0ffcf4e8d2fb05b2a57fc2127451ece8556cf5Peter Qiuvoid Manager::ReleaseInterface(const string& interface_name) {
1062a6fb338dced5622d701da61c5ee06b3df7dbad7Peter Qiu  shill_manager_.ReleaseInterface(interface_name);
1077e0ffcf4e8d2fb05b2a57fc2127451ece8556cf5Peter Qiu}
1087e0ffcf4e8d2fb05b2a57fc2127451ece8556cf5Peter Qiu
109cbbefa251257018b08ab4466da0e6ad1f459ae1aPeter Qiu#if defined(__BRILLO__)
110cbbefa251257018b08ab4466da0e6ad1f459ae1aPeter Qiubool Manager::SetupApModeInterface(string* interface_name) {
111cbbefa251257018b08ab4466da0e6ad1f459ae1aPeter Qiu  return shill_manager_.SetupApModeInterface(interface_name);
112cbbefa251257018b08ab4466da0e6ad1f459ae1aPeter Qiu}
113cbbefa251257018b08ab4466da0e6ad1f459ae1aPeter Qiu
114cbbefa251257018b08ab4466da0e6ad1f459ae1aPeter Qiubool Manager::SetupStationModeInterface(string* interface_name) {
115cbbefa251257018b08ab4466da0e6ad1f459ae1aPeter Qiu  return shill_manager_.SetupStationModeInterface(interface_name);
116cbbefa251257018b08ab4466da0e6ad1f459ae1aPeter Qiu}
117cbbefa251257018b08ab4466da0e6ad1f459ae1aPeter Qiu#endif  // __BRILLO__
118cbbefa251257018b08ab4466da0e6ad1f459ae1aPeter Qiu
119943cf3a0afdad2cc6bea02b181f09e6ff23df628Peter Qiuvoid Manager::RequestDHCPPortAccess(const string& interface) {
120943cf3a0afdad2cc6bea02b181f09e6ff23df628Peter Qiu  firewall_manager_.RequestDHCPPortAccess(interface);
121943cf3a0afdad2cc6bea02b181f09e6ff23df628Peter Qiu}
122943cf3a0afdad2cc6bea02b181f09e6ff23df628Peter Qiu
123943cf3a0afdad2cc6bea02b181f09e6ff23df628Peter Qiuvoid Manager::ReleaseDHCPPortAccess(const string& interface) {
124943cf3a0afdad2cc6bea02b181f09e6ff23df628Peter Qiu  firewall_manager_.ReleaseDHCPPortAccess(interface);
125943cf3a0afdad2cc6bea02b181f09e6ff23df628Peter Qiu}
126943cf3a0afdad2cc6bea02b181f09e6ff23df628Peter Qiu
1275dd242dfe5acf25696f877999320ac4164785a5Peter Qiu}  // namespace apmanager
128