blob: 078d9877a6004a226a0e5d45c78f776c281c74e2 [file] [log] [blame]
Alexander Afanasyev31c781e2015-02-09 17:39:59 -08001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Junxiao Shi2d491752017-07-14 21:32:05 +00002/*
ashiqopu3ad49db2018-10-20 22:38:47 +00003 * Copyright (c) 2014-2019, Regents of the University of California,
Alexander Afanasyev31c781e2015-02-09 17:39:59 -08004 * Arizona Board of Regents,
5 * Colorado State University,
6 * University Pierre & Marie Curie, Sorbonne University,
7 * Washington University in St. Louis,
8 * Beijing Institute of Technology,
9 * The University of Memphis.
10 *
11 * This file is part of NFD (Named Data Networking Forwarding Daemon).
12 * See AUTHORS.md for complete list of NFD authors and contributors.
13 *
14 * NFD is free software: you can redistribute it and/or modify it under the terms
15 * of the GNU General Public License as published by the Free Software Foundation,
16 * either version 3 of the License, or (at your option) any later version.
17 *
18 * NFD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
19 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
20 * PURPOSE. See the GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License along with
23 * NFD, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
24 */
25
26#include "nfd.hpp"
Davide Pesavento3dade002019-03-19 11:29:56 -060027#include "global.hpp"
Junxiao Shif2bfb442018-01-05 12:34:57 +000028#include "core/config-file.hpp"
Davide Pesaventoa3148082018-04-12 18:21:54 -040029#include "core/log-config-section.hpp"
Alexander Afanasyev31c781e2015-02-09 17:39:59 -080030#include "core/privilege-helper.hpp"
Junxiao Shiea47bde2017-01-26 17:49:16 +000031#include "face/face-system.hpp"
Yanbiao Li4ee73d42015-08-19 16:30:16 -070032#include "face/internal-face.hpp"
Junxiao Shif2bfb442018-01-05 12:34:57 +000033#include "face/null-face.hpp"
34#include "fw/forwarder.hpp"
35#include "mgmt/cs-manager.hpp"
Alexander Afanasyev31c781e2015-02-09 17:39:59 -080036#include "mgmt/face-manager.hpp"
Junxiao Shif2bfb442018-01-05 12:34:57 +000037#include "mgmt/fib-manager.hpp"
Yanbiao Li7cec7ea2015-08-19 16:30:16 -070038#include "mgmt/forwarder-status-manager.hpp"
Alexander Afanasyev31c781e2015-02-09 17:39:59 -080039#include "mgmt/general-config-section.hpp"
Junxiao Shif2bfb442018-01-05 12:34:57 +000040#include "mgmt/strategy-choice-manager.hpp"
Alexander Afanasyev31c781e2015-02-09 17:39:59 -080041#include "mgmt/tables-config-section.hpp"
42
43namespace nfd {
44
Davide Pesaventoa3148082018-04-12 18:21:54 -040045NFD_LOG_INIT(Nfd);
Alexander Afanasyev3f41ade2015-06-29 18:31:22 -070046
Alexander Afanasyev31c781e2015-02-09 17:39:59 -080047static const std::string INTERNAL_CONFIG = "internal://nfd.conf";
48
Junxiao Shi2d491752017-07-14 21:32:05 +000049Nfd::Nfd(ndn::KeyChain& keyChain)
50 : m_keyChain(keyChain)
51 , m_netmon(make_shared<ndn::net::NetworkMonitor>(getGlobalIoService()))
Alexander Afanasyev441ba212015-09-10 23:41:07 -070052{
Alexander Afanasyev441ba212015-09-10 23:41:07 -070053}
54
Alexander Afanasyev31c781e2015-02-09 17:39:59 -080055Nfd::Nfd(const std::string& configFile, ndn::KeyChain& keyChain)
Junxiao Shi2d491752017-07-14 21:32:05 +000056 : Nfd(keyChain)
Alexander Afanasyev31c781e2015-02-09 17:39:59 -080057{
Junxiao Shi2d491752017-07-14 21:32:05 +000058 m_configFile = configFile;
Alexander Afanasyev31c781e2015-02-09 17:39:59 -080059}
60
61Nfd::Nfd(const ConfigSection& config, ndn::KeyChain& keyChain)
Junxiao Shi2d491752017-07-14 21:32:05 +000062 : Nfd(keyChain)
Alexander Afanasyev31c781e2015-02-09 17:39:59 -080063{
Junxiao Shi2d491752017-07-14 21:32:05 +000064 m_configSection = config;
Alexander Afanasyev31c781e2015-02-09 17:39:59 -080065}
66
Junxiao Shi9ddf1b52016-08-22 03:58:55 +000067// It is necessary to explicitly define the destructor, because some member variables (e.g.,
68// unique_ptr<Forwarder>) are forward-declared, but implicitly declared destructor requires
69// complete types for all members when instantiated.
70Nfd::~Nfd() = default;
Alexander Afanasyev2bda6f82015-02-10 14:17:19 -080071
Alexander Afanasyev31c781e2015-02-09 17:39:59 -080072void
73Nfd::initialize()
74{
Davide Pesaventoa3148082018-04-12 18:21:54 -040075 configureLogging();
Alexander Afanasyev31c781e2015-02-09 17:39:59 -080076
Davide Pesaventocfb1a312018-03-01 01:30:56 -050077 m_forwarder = make_unique<Forwarder>();
Alexander Afanasyev31c781e2015-02-09 17:39:59 -080078
Junxiao Shia044be72015-10-26 11:00:56 -070079 FaceTable& faceTable = m_forwarder->getFaceTable();
Junxiao Shicde37ad2015-12-24 01:02:05 -070080 faceTable.addReserved(face::makeNullFace(), face::FACEID_NULL);
81 faceTable.addReserved(face::makeNullFace(FaceUri("contentstore://")), face::FACEID_CONTENT_STORE);
Junxiao Shi2d491752017-07-14 21:32:05 +000082 m_faceSystem = make_unique<face::FaceSystem>(faceTable, m_netmon);
Junxiao Shiea47bde2017-01-26 17:49:16 +000083
84 initializeManagement();
Alexander Afanasyev31c781e2015-02-09 17:39:59 -080085
Alexander Afanasyev31c781e2015-02-09 17:39:59 -080086 PrivilegeHelper::drop();
Alexander Afanasyev3f41ade2015-06-29 18:31:22 -070087
Junxiao Shi2d491752017-07-14 21:32:05 +000088 m_netmon->onNetworkStateChanged.connect([this] {
89 // delay stages, so if multiple events are triggered in short sequence,
90 // only one auto-detection procedure is triggered
Davide Pesavento3dade002019-03-19 11:29:56 -060091 m_reloadConfigEvent = getScheduler().schedule(5_s,
Junxiao Shi2d491752017-07-14 21:32:05 +000092 [this] {
93 NFD_LOG_INFO("Network change detected, reloading face section of the config file...");
94 this->reloadConfigFileFaceSection();
95 });
96 });
Alexander Afanasyev31c781e2015-02-09 17:39:59 -080097}
98
99void
Davide Pesaventoa3148082018-04-12 18:21:54 -0400100Nfd::configureLogging()
Alexander Afanasyev31c781e2015-02-09 17:39:59 -0800101{
102 ConfigFile config(&ConfigFile::ignoreUnknownSection);
Davide Pesaventoa3148082018-04-12 18:21:54 -0400103 log::setConfigFile(config);
Alexander Afanasyev31c781e2015-02-09 17:39:59 -0800104
105 if (!m_configFile.empty()) {
106 config.parse(m_configFile, true);
107 config.parse(m_configFile, false);
108 }
109 else {
110 config.parse(m_configSection, true, INTERNAL_CONFIG);
111 config.parse(m_configSection, false, INTERNAL_CONFIG);
112 }
113}
114
Alexander Afanasyev31c781e2015-02-09 17:39:59 -0800115static inline void
116ignoreRibAndLogSections(const std::string& filename, const std::string& sectionName,
117 const ConfigSection& section, bool isDryRun)
118{
119 // Ignore "log" and "rib" sections, but raise an error if we're missing a
120 // handler for an NFD section.
121 if (sectionName == "rib" || sectionName == "log") {
122 // do nothing
123 }
124 else {
125 // missing NFD section
126 ConfigFile::throwErrorOnUnknownSection(filename, sectionName, section, isDryRun);
127 }
128}
129
130void
131Nfd::initializeManagement()
132{
Junxiao Shi6535f1e2015-10-08 13:02:18 -0700133 std::tie(m_internalFace, m_internalClientFace) = face::makeInternalFace(m_keyChain);
Junxiao Shicde37ad2015-12-24 01:02:05 -0700134 m_forwarder->getFaceTable().addReserved(m_internalFace, face::FACEID_INTERNAL_FACE);
Junxiao Shi9ddf1b52016-08-22 03:58:55 +0000135
Davide Pesaventocfb1a312018-03-01 01:30:56 -0500136 m_dispatcher = make_unique<ndn::mgmt::Dispatcher>(*m_internalClientFace, m_keyChain);
Junxiao Shi9ddf1b52016-08-22 03:58:55 +0000137 m_authenticator = CommandAuthenticator::create();
Alexander Afanasyev31c781e2015-02-09 17:39:59 -0800138
Davide Pesaventocfb1a312018-03-01 01:30:56 -0500139 m_forwarderStatusManager = make_unique<ForwarderStatusManager>(*m_forwarder, *m_dispatcher);
140 m_faceManager = make_unique<FaceManager>(*m_faceSystem, *m_dispatcher, *m_authenticator);
141 m_fibManager = make_unique<FibManager>(m_forwarder->getFib(), m_forwarder->getFaceTable(),
142 *m_dispatcher, *m_authenticator);
143 m_csManager = make_unique<CsManager>(m_forwarder->getCs(), m_forwarder->getCounters(),
144 *m_dispatcher, *m_authenticator);
145 m_strategyChoiceManager = make_unique<StrategyChoiceManager>(m_forwarder->getStrategyChoice(),
146 *m_dispatcher, *m_authenticator);
Alexander Afanasyev31c781e2015-02-09 17:39:59 -0800147
148 ConfigFile config(&ignoreRibAndLogSections);
149 general::setConfigFile(config);
150
Junxiao Shi0cc125c2016-08-25 21:50:04 +0000151 TablesConfigSection tablesConfig(*m_forwarder);
Alexander Afanasyev31c781e2015-02-09 17:39:59 -0800152 tablesConfig.setConfigFile(config);
153
Junxiao Shi9ddf1b52016-08-22 03:58:55 +0000154 m_authenticator->setConfigFile(config);
Davide Pesaventocfb1a312018-03-01 01:30:56 -0500155 m_faceSystem->setConfigFile(config);
Alexander Afanasyev31c781e2015-02-09 17:39:59 -0800156
157 // parse config file
158 if (!m_configFile.empty()) {
159 config.parse(m_configFile, true);
160 config.parse(m_configFile, false);
161 }
162 else {
163 config.parse(m_configSection, true, INTERNAL_CONFIG);
164 config.parse(m_configSection, false, INTERNAL_CONFIG);
165 }
166
Junxiao Shi0cc125c2016-08-25 21:50:04 +0000167 tablesConfig.ensureConfigured();
Alexander Afanasyev31c781e2015-02-09 17:39:59 -0800168
169 // add FIB entry for NFD Management Protocol
Yanbiao Li698f4fe2015-08-19 16:30:16 -0700170 Name topPrefix("/localhost/nfd");
ashiqopu3ad49db2018-10-20 22:38:47 +0000171 m_forwarder->getFib().insert(topPrefix).first->addOrUpdateNextHop(*m_internalFace, 0, 0);
Yanbiao Li698f4fe2015-08-19 16:30:16 -0700172 m_dispatcher->addTopPrefix(topPrefix, false);
Alexander Afanasyev31c781e2015-02-09 17:39:59 -0800173}
174
175void
176Nfd::reloadConfigFile()
177{
Davide Pesaventoa3148082018-04-12 18:21:54 -0400178 configureLogging();
Alexander Afanasyev31c781e2015-02-09 17:39:59 -0800179
Alexander Afanasyev31c781e2015-02-09 17:39:59 -0800180 ConfigFile config(&ignoreRibAndLogSections);
Alexander Afanasyev31c781e2015-02-09 17:39:59 -0800181 general::setConfigFile(config);
182
Junxiao Shi0cc125c2016-08-25 21:50:04 +0000183 TablesConfigSection tablesConfig(*m_forwarder);
Alexander Afanasyev31c781e2015-02-09 17:39:59 -0800184 tablesConfig.setConfigFile(config);
185
Junxiao Shi9ddf1b52016-08-22 03:58:55 +0000186 m_authenticator->setConfigFile(config);
Davide Pesaventocfb1a312018-03-01 01:30:56 -0500187 m_faceSystem->setConfigFile(config);
Alexander Afanasyev31c781e2015-02-09 17:39:59 -0800188
189 if (!m_configFile.empty()) {
190 config.parse(m_configFile, false);
191 }
192 else {
193 config.parse(m_configSection, false, INTERNAL_CONFIG);
194 }
195}
196
Alexander Afanasyev3f41ade2015-06-29 18:31:22 -0700197void
198Nfd::reloadConfigFileFaceSection()
199{
200 // reload only face_system section of the config file to re-initialize multicast faces
201 ConfigFile config(&ConfigFile::ignoreUnknownSection);
Davide Pesaventocfb1a312018-03-01 01:30:56 -0500202 m_faceSystem->setConfigFile(config);
Alexander Afanasyev3f41ade2015-06-29 18:31:22 -0700203
204 if (!m_configFile.empty()) {
205 config.parse(m_configFile, false);
206 }
207 else {
208 config.parse(m_configSection, false, INTERNAL_CONFIG);
209 }
210}
211
Alexander Afanasyev31c781e2015-02-09 17:39:59 -0800212} // namespace nfd