blob: ff76f1d50f7fd3a7dcbb7ff171e285138946eefc [file] [log] [blame]
Ben Chanfad4a0b2012-04-18 15:49:59 -07001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Darin Petkov50308cd2011-06-01 18:25:07 -07002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "shill/dhcp_provider.h"
6
Albert Chaulk0e1cdea2013-02-27 15:32:55 -08007#include <base/file_util.h>
Ben Chana0ddf462014-02-06 11:32:42 -08008#include <base/strings/stringprintf.h>
Albert Chaulk0e1cdea2013-02-27 15:32:55 -08009
Chris Masone19e30402011-07-19 15:48:47 -070010#include "shill/control_interface.h"
Chris Masone2b105542011-06-22 10:58:09 -070011#include "shill/dhcp_config.h"
Darin Petkovd1b715b2011-06-02 21:21:22 -070012#include "shill/dhcpcd_proxy.h"
Christopher Wileyb691efd2012-08-09 13:51:51 -070013#include "shill/logging.h"
Darin Petkovaceede32011-07-18 15:32:38 -070014#include "shill/proxy_factory.h"
Darin Petkovd1b715b2011-06-02 21:21:22 -070015
Albert Chaulk0e1cdea2013-02-27 15:32:55 -080016using base::FilePath;
Darin Petkovf65e9282011-06-21 14:29:56 -070017using std::string;
18
Darin Petkov50308cd2011-06-01 18:25:07 -070019namespace shill {
20
Darin Petkove636c692012-05-31 10:22:17 +020021namespace {
22base::LazyInstance<DHCPProvider> g_dhcp_provider = LAZY_INSTANCE_INITIALIZER;
23} // namespace
Paul Stewart0d2ada32011-08-09 17:01:57 -070024
mukesh agrawal88fb16f2014-04-24 10:37:39 -070025constexpr char DHCPProvider::kDHCPCDPathFormatLease[];
Albert Chaulk0e1cdea2013-02-27 15:32:55 -080026
Darin Petkova7b89492011-07-27 12:48:17 -070027DHCPProvider::DHCPProvider()
Darin Petkovab565bb2011-10-06 02:55:51 -070028 : proxy_factory_(ProxyFactory::GetInstance()),
Albert Chaulk0e1cdea2013-02-27 15:32:55 -080029 root_("/"),
Darin Petkovab565bb2011-10-06 02:55:51 -070030 control_interface_(NULL),
Darin Petkova7b89492011-07-27 12:48:17 -070031 dispatcher_(NULL),
32 glib_(NULL) {
Ben Chanfad4a0b2012-04-18 15:49:59 -070033 SLOG(DHCP, 2) << __func__;
Darin Petkov50308cd2011-06-01 18:25:07 -070034}
35
36DHCPProvider::~DHCPProvider() {
Ben Chanfad4a0b2012-04-18 15:49:59 -070037 SLOG(DHCP, 2) << __func__;
Darin Petkov50308cd2011-06-01 18:25:07 -070038}
39
40DHCPProvider* DHCPProvider::GetInstance() {
Paul Stewart0d2ada32011-08-09 17:01:57 -070041 return g_dhcp_provider.Pointer();
Darin Petkov50308cd2011-06-01 18:25:07 -070042}
43
Darin Petkova7b89492011-07-27 12:48:17 -070044void DHCPProvider::Init(ControlInterface *control_interface,
45 EventDispatcher *dispatcher,
46 GLib *glib) {
Ben Chanfad4a0b2012-04-18 15:49:59 -070047 SLOG(DHCP, 2) << __func__;
Darin Petkovab565bb2011-10-06 02:55:51 -070048 listener_.reset(new DHCPCDListener(proxy_factory_->connection(), this));
Darin Petkovf7897bc2011-06-08 17:13:36 -070049 glib_ = glib;
Chris Masone19e30402011-07-19 15:48:47 -070050 control_interface_ = control_interface;
Darin Petkova7b89492011-07-27 12:48:17 -070051 dispatcher_ = dispatcher;
Darin Petkovd1b715b2011-06-02 21:21:22 -070052}
53
Paul Stewartd32f4842012-01-11 16:08:13 -080054DHCPConfigRefPtr DHCPProvider::CreateConfig(const string &device_name,
Paul Stewartd408fdf2012-05-07 17:15:57 -070055 const string &host_name,
56 const string &lease_file_suffix,
Paul Stewart75a68b92013-10-24 10:50:27 -070057 bool arp_gateway,
58 bool minimal_config) {
Ben Chanfad4a0b2012-04-18 15:49:59 -070059 SLOG(DHCP, 2) << __func__ << " device: " << device_name;
Paul Stewartd408fdf2012-05-07 17:15:57 -070060 return new DHCPConfig(control_interface_,
61 dispatcher_,
62 this,
63 device_name,
64 host_name,
65 lease_file_suffix,
66 arp_gateway,
Paul Stewart75a68b92013-10-24 10:50:27 -070067 minimal_config,
Paul Stewartd408fdf2012-05-07 17:15:57 -070068 glib_);
Darin Petkovd1b715b2011-06-02 21:21:22 -070069}
70
Darin Petkov98dd6a02011-06-10 15:12:57 -070071DHCPConfigRefPtr DHCPProvider::GetConfig(int pid) {
Ben Chanfad4a0b2012-04-18 15:49:59 -070072 SLOG(DHCP, 2) << __func__ << " pid: " << pid;
Darin Petkovf9b0ca82011-06-20 12:10:23 -070073 PIDConfigMap::const_iterator it = configs_.find(pid);
Darin Petkovd1b715b2011-06-02 21:21:22 -070074 if (it == configs_.end()) {
Darin Petkov98dd6a02011-06-10 15:12:57 -070075 return NULL;
Darin Petkovd1b715b2011-06-02 21:21:22 -070076 }
77 return it->second;
78}
79
Chris Masone2b105542011-06-22 10:58:09 -070080void DHCPProvider::BindPID(int pid, const DHCPConfigRefPtr &config) {
Ben Chanfad4a0b2012-04-18 15:49:59 -070081 SLOG(DHCP, 2) << __func__ << " pid: " << pid;
Darin Petkovd1b715b2011-06-02 21:21:22 -070082 configs_[pid] = config;
83}
84
Darin Petkov92c43902011-06-09 20:46:06 -070085void DHCPProvider::UnbindPID(int pid) {
Ben Chanfad4a0b2012-04-18 15:49:59 -070086 SLOG(DHCP, 2) << __func__ << " pid: " << pid;
Darin Petkovd1b715b2011-06-02 21:21:22 -070087 configs_.erase(pid);
88}
89
Albert Chaulk0e1cdea2013-02-27 15:32:55 -080090void DHCPProvider::DestroyLease(const string &name) {
91 SLOG(DHCP, 2) << __func__ << " name: " << name;
Ben Chana0ddf462014-02-06 11:32:42 -080092 base::DeleteFile(root_.Append(
Albert Chaulk0e1cdea2013-02-27 15:32:55 -080093 base::StringPrintf(kDHCPCDPathFormatLease,
94 name.c_str())), false);
95}
96
Darin Petkov50308cd2011-06-01 18:25:07 -070097} // namespace shill