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