blob: 4152c08352d4eb48d2d30a3fbfb980a1e4f4983c [file] [log] [blame]
Thieu Le3426c8f2012-01-11 17:35:11 -08001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Paul Stewart75897df2011-04-27 09:05:53 -07002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Darin Petkova7b89492011-07-27 12:48:17 -07005#include "shill/shill_daemon.h"
Paul Stewart75897df2011-04-27 09:05:53 -07006
Darin Petkova7b89492011-07-27 12:48:17 -07007#include <stdio.h>
8
Paul Stewart75897df2011-04-27 09:05:53 -07009#include <string>
Gaurav Shah71354762011-11-28 19:22:49 -080010#include <vector>
Paul Stewart75897df2011-04-27 09:05:53 -070011
Gary Moraina9fb3252012-05-31 12:05:31 -070012#include <base/bind.h>
Chris Masone2ae797d2011-08-23 20:41:00 -070013#include <base/file_path.h>
Chris Masoneee929b72011-05-10 10:02:18 -070014#include <base/logging.h>
15
Darin Petkova7b89492011-07-27 12:48:17 -070016#include "shill/dhcp_provider.h"
Gaurav Shah71354762011-11-28 19:22:49 -080017#include "shill/error.h"
Darin Petkov3c5e4dc2012-04-02 14:44:27 +020018#include "shill/nss.h"
Darin Petkovab565bb2011-10-06 02:55:51 -070019#include "shill/proxy_factory.h"
Paul Stewartc1dec4d2011-12-08 15:25:28 -080020#include "shill/routing_table.h"
Paul Stewarta3c56f92011-05-26 07:08:52 -070021#include "shill/rtnl_handler.h"
Ben Chanfad4a0b2012-04-18 15:49:59 -070022#include "shill/scope_logger.h"
Chris Masone2ae797d2011-08-23 20:41:00 -070023#include "shill/shill_config.h"
Paul Stewart75897df2011-04-27 09:05:53 -070024
Gary Moraina9fb3252012-05-31 12:05:31 -070025using base::Bind;
26using base::Unretained;
Paul Stewart75897df2011-04-27 09:05:53 -070027using std::string;
Gaurav Shah71354762011-11-28 19:22:49 -080028using std::vector;
Paul Stewart75897df2011-04-27 09:05:53 -070029
30namespace shill {
31
Gary Moraina9fb3252012-05-31 12:05:31 -070032// TODO(gmorain): 3 seconds may or may not be enough. Add an UMA stat to see
33// how often the timeout occurs. crosbug.com/31475.
34const int Daemon::kTerminationActionsTimeout = 3000; // ms
35
Darin Petkova7b89492011-07-27 12:48:17 -070036Daemon::Daemon(Config *config, ControlInterface *control)
37 : config_(config),
38 control_(control),
Darin Petkov3c5e4dc2012-04-02 14:44:27 +020039 nss_(NSS::GetInstance()),
Thieu Lefb46caf2012-03-08 11:57:15 -080040 proxy_factory_(ProxyFactory::GetInstance()),
41 rtnl_handler_(RTNLHandler::GetInstance()),
42 routing_table_(RoutingTable::GetInstance()),
43 dhcp_provider_(DHCPProvider::GetInstance()),
44 manager_(new Manager(control_,
45 &dispatcher_,
46 &metrics_,
47 &glib_,
48 config->GetRunDirectory(),
49 config->GetStorageDirectory(),
50 config->GetUserStorageDirectoryFormat())) {
Chris Masone2ae797d2011-08-23 20:41:00 -070051}
Paul Stewart75897df2011-04-27 09:05:53 -070052Daemon::~Daemon() {}
53
mukesh agrawal8f317b62011-07-15 11:53:23 -070054void Daemon::AddDeviceToBlackList(const string &device_name) {
Thieu Lefb46caf2012-03-08 11:57:15 -080055 manager_->AddDeviceToBlackList(device_name);
mukesh agrawal8f317b62011-07-15 11:53:23 -070056}
57
Paul Stewart10e9e4e2012-04-26 19:46:28 -070058void Daemon::SetStartupPortalList(const string &portal_list) {
59 manager_->SetStartupPortalList(portal_list);
60}
61
Gaurav Shah71354762011-11-28 19:22:49 -080062void Daemon::SetStartupProfiles(const vector<string> &profile_name_list) {
63 Error error;
Thieu Lefb46caf2012-03-08 11:57:15 -080064 manager_->set_startup_profiles(profile_name_list);
Thieu Le1271d682011-11-02 22:48:19 +000065}
66
Paul Stewart75897df2011-04-27 09:05:53 -070067void Daemon::Run() {
Paul Stewart0af98bf2011-05-10 17:38:08 -070068 Start();
Ben Chanfad4a0b2012-04-18 15:49:59 -070069 SLOG(Daemon, 1) << "Running main loop.";
Chris Masonec5b392e2011-05-14 16:31:01 -070070 dispatcher_.DispatchForever();
Ben Chanfad4a0b2012-04-18 15:49:59 -070071 SLOG(Daemon, 1) << "Exited main loop.";
Thieu Le1271d682011-11-02 22:48:19 +000072}
73
74void Daemon::Quit() {
Gary Moraina9fb3252012-05-31 12:05:31 -070075 SLOG(Daemon, 1) << "Starting termination actions.";
76 // Stop() prevents autoconnect from attempting to immediately connect to
77 // services after they have been disconnected.
78 Stop();
79 manager_->RunTerminationActions(kTerminationActionsTimeout,
80 Bind(&Daemon::TerminationActionsCompleted,
81 Unretained(this)));
82}
83
84void Daemon::TerminationActionsCompleted(const Error & error) {
85 SLOG(Daemon, 1) << "Finished termination actions. Result: " << error;
Eric Shienbrood3e20a232012-02-16 11:35:56 -050086 dispatcher_.PostTask(MessageLoop::QuitClosure());
Paul Stewart75897df2011-04-27 09:05:53 -070087}
88
Gaurav Shah71354762011-11-28 19:22:49 -080089void Daemon::Start() {
90 glib_.TypeInit();
Darin Petkov3c5e4dc2012-04-02 14:44:27 +020091 nss_->Init(&glib_);
Thieu Lefb46caf2012-03-08 11:57:15 -080092 proxy_factory_->Init();
93 rtnl_handler_->Start(&dispatcher_, &sockets_);
94 routing_table_->Start();
95 dhcp_provider_->Init(control_, &dispatcher_, &glib_);
96 manager_->Start();
Gaurav Shah71354762011-11-28 19:22:49 -080097}
98
99void Daemon::Stop() {
Thieu Lefb46caf2012-03-08 11:57:15 -0800100 manager_->Stop();
Gaurav Shah71354762011-11-28 19:22:49 -0800101}
Paul Stewart75897df2011-04-27 09:05:53 -0700102
103} // namespace shill