blob: 722af0581835a40182c69937788370aab787cebe [file] [log] [blame]
Peter Qiu326b6cf2015-09-02 11:11:42 -07001//
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//
Peter Qiu1810c012015-02-05 14:35:41 -080016
17#include "apmanager/firewall_manager.h"
18
19#include <base/bind.h>
Alex Vakulenko8d0c31b2015-10-13 09:14:24 -070020#include <brillo/errors/error.h>
Peter Qiu1810c012015-02-05 14:35:41 -080021
Peter Qiube128822015-10-13 13:55:03 -070022#include "apmanager/control_interface.h"
Peter Qiu9b2ecc42015-09-17 14:37:22 -070023
Peter Qiu1810c012015-02-05 14:35:41 -080024using std::string;
25
26namespace apmanager {
27
28namespace {
Peter Qiu1810c012015-02-05 14:35:41 -080029const uint16_t kDhcpServerPort = 67;
Peter Qiu1810c012015-02-05 14:35:41 -080030} // namespace
31
Peter Qiu9b2ecc42015-09-17 14:37:22 -070032FirewallManager::FirewallManager() {}
Peter Qiu1810c012015-02-05 14:35:41 -080033
Peter Qiu9b2ecc42015-09-17 14:37:22 -070034FirewallManager::~FirewallManager() {}
Peter Qiu1810c012015-02-05 14:35:41 -080035
Peter Qiube128822015-10-13 13:55:03 -070036void FirewallManager::Init(ControlInterface* control_interface) {
Peter Qiu9b2ecc42015-09-17 14:37:22 -070037 CHECK(!firewall_proxy_) << "Already started";
Peter Qiube128822015-10-13 13:55:03 -070038 firewall_proxy_ =
39 control_interface->CreateFirewallProxy(
Peter Qiu9b2ecc42015-09-17 14:37:22 -070040 base::Bind(&FirewallManager::OnFirewallServiceAppeared,
41 weak_factory_.GetWeakPtr()),
42 base::Bind(&FirewallManager::OnFirewallServiceVanished,
Peter Qiube128822015-10-13 13:55:03 -070043 weak_factory_.GetWeakPtr()));
Peter Qiu1810c012015-02-05 14:35:41 -080044}
45
Peter Qiu943cf3a2015-02-24 10:59:17 -080046void FirewallManager::RequestDHCPPortAccess(const std::string& interface) {
Peter Qiu9b2ecc42015-09-17 14:37:22 -070047 CHECK(firewall_proxy_) << "Proxy not initialized yet";
Peter Qiu943cf3a2015-02-24 10:59:17 -080048 if (dhcp_access_interfaces_.find(interface) !=
49 dhcp_access_interfaces_.end()) {
50 LOG(ERROR) << "DHCP access already requested for interface: " << interface;
51 return;
52 }
Peter Qiu9b2ecc42015-09-17 14:37:22 -070053 firewall_proxy_->RequestUdpPortAccess(interface, kDhcpServerPort);
Peter Qiu943cf3a2015-02-24 10:59:17 -080054 dhcp_access_interfaces_.insert(interface);
55}
56
57void FirewallManager::ReleaseDHCPPortAccess(const std::string& interface) {
Peter Qiu9b2ecc42015-09-17 14:37:22 -070058 CHECK(firewall_proxy_) << "Proxy not initialized yet";
Peter Qiu943cf3a2015-02-24 10:59:17 -080059 if (dhcp_access_interfaces_.find(interface) ==
60 dhcp_access_interfaces_.end()) {
61 LOG(ERROR) << "DHCP access has not been requested for interface: "
62 << interface;
63 return;
64 }
Peter Qiu9b2ecc42015-09-17 14:37:22 -070065 firewall_proxy_->ReleaseUdpPortAccess(interface, kDhcpServerPort);
Peter Qiu943cf3a2015-02-24 10:59:17 -080066 dhcp_access_interfaces_.erase(interface);
67}
68
Peter Qiu9b2ecc42015-09-17 14:37:22 -070069void FirewallManager::OnFirewallServiceAppeared() {
70 LOG(INFO) << __func__;
Peter Qiu943cf3a2015-02-24 10:59:17 -080071 RequestAllPortsAccess();
Peter Qiu1810c012015-02-05 14:35:41 -080072}
73
Peter Qiu9b2ecc42015-09-17 14:37:22 -070074void FirewallManager::OnFirewallServiceVanished() {
75 // Nothing need to be done.
76 LOG(INFO) << __func__;
Peter Qiu1810c012015-02-05 14:35:41 -080077}
78
Peter Qiu943cf3a2015-02-24 10:59:17 -080079void FirewallManager::RequestAllPortsAccess() {
80 // Request access to DHCP port for all specified interfaces.
81 for (const auto& dhcp_interface : dhcp_access_interfaces_) {
Peter Qiu9b2ecc42015-09-17 14:37:22 -070082 firewall_proxy_->RequestUdpPortAccess(dhcp_interface, kDhcpServerPort);
Peter Qiu943cf3a2015-02-24 10:59:17 -080083 }
Peter Qiu1810c012015-02-05 14:35:41 -080084}
85
Peter Qiu1810c012015-02-05 14:35:41 -080086} // namespace apmanager