blob: d42be83b7a66ed7886a48c84cddfdc634bc825b5 [file] [log] [blame]
Alexander Afanasyev31c781e2015-02-09 17:39:59 -08001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
3 * Copyright (c) 2014-2015, Regents of the University of California,
4 * 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"
27
Alexander Afanasyev3f41ade2015-06-29 18:31:22 -070028#include "core/global-io.hpp"
Alexander Afanasyev31c781e2015-02-09 17:39:59 -080029#include "core/logger-factory.hpp"
30#include "core/privilege-helper.hpp"
Alexander Afanasyev3f41ade2015-06-29 18:31:22 -070031#include "core/config-file.hpp"
Alexander Afanasyev31c781e2015-02-09 17:39:59 -080032#include "fw/forwarder.hpp"
33#include "face/null-face.hpp"
Yanbiao Li4ee73d42015-08-19 16:30:16 -070034#include "face/internal-face.hpp"
35#include "face/internal-client-face.hpp"
Yanbiao Li711c7932015-08-19 16:30:16 -070036#include "mgmt/fib-manager.hpp"
Yanbiao Li73860e32015-08-19 16:30:16 -070037#include "mgmt/face-manager.hpp"
Yanbiao Li36f35002015-08-19 16:30:16 -070038// #include "mgmt/strategy-choice-manager.hpp"
Yanbiao Li7cec7ea2015-08-19 16:30:16 -070039#include "mgmt/forwarder-status-manager.hpp"
Alexander Afanasyev31c781e2015-02-09 17:39:59 -080040#include "mgmt/general-config-section.hpp"
41#include "mgmt/tables-config-section.hpp"
Yanbiao Li698f4fe2015-08-19 16:30:16 -070042#include "mgmt/command-validator.hpp"
43
44#include <ndn-cxx/mgmt/dispatcher.hpp>
Alexander Afanasyev31c781e2015-02-09 17:39:59 -080045
46namespace nfd {
47
Alexander Afanasyev3f41ade2015-06-29 18:31:22 -070048NFD_LOG_INIT("Nfd");
49
Alexander Afanasyev31c781e2015-02-09 17:39:59 -080050static const std::string INTERNAL_CONFIG = "internal://nfd.conf";
51
52Nfd::Nfd(const std::string& configFile, ndn::KeyChain& keyChain)
53 : m_configFile(configFile)
Yanbiao Li4ee73d42015-08-19 16:30:16 -070054 , m_keyChain(keyChain)
Alexander Afanasyev3f41ade2015-06-29 18:31:22 -070055 , m_networkMonitor(getGlobalIoService())
Alexander Afanasyev31c781e2015-02-09 17:39:59 -080056{
57}
58
59Nfd::Nfd(const ConfigSection& config, ndn::KeyChain& keyChain)
60 : m_configSection(config)
Yanbiao Li4ee73d42015-08-19 16:30:16 -070061 , m_keyChain(keyChain)
Alexander Afanasyev3f41ade2015-06-29 18:31:22 -070062 , m_networkMonitor(getGlobalIoService())
Alexander Afanasyev31c781e2015-02-09 17:39:59 -080063{
64}
65
Alexander Afanasyev2bda6f82015-02-10 14:17:19 -080066Nfd::~Nfd()
67{
68 // It is necessary to explicitly define the destructor, because some member variables (e.g.,
69 // unique_ptr<Forwarder>) are forward-declared, but implicitly declared destructor requires
70 // complete types for all members when instantiated.
71}
72
Alexander Afanasyev31c781e2015-02-09 17:39:59 -080073void
74Nfd::initialize()
75{
76 initializeLogging();
77
Alexander Afanasyev2bda6f82015-02-10 14:17:19 -080078 m_forwarder.reset(new Forwarder());
Alexander Afanasyev31c781e2015-02-09 17:39:59 -080079
80 initializeManagement();
81
82 m_forwarder->getFaceTable().addReserved(make_shared<NullFace>(), FACEID_NULL);
83 m_forwarder->getFaceTable().addReserved(make_shared<NullFace>(FaceUri("contentstore://")),
84 FACEID_CONTENT_STORE);
85
Alexander Afanasyev31c781e2015-02-09 17:39:59 -080086 PrivilegeHelper::drop();
Alexander Afanasyev3f41ade2015-06-29 18:31:22 -070087
88 m_networkMonitor.onNetworkStateChanged.connect([this] {
89 // delay stages, so if multiple events are triggered in short sequence,
90 // only one auto-detection procedure is triggered
91 m_reloadConfigEvent = scheduler::schedule(time::seconds(5),
92 [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
100Nfd::initializeLogging()
101{
102 ConfigFile config(&ConfigFile::ignoreUnknownSection);
103 LoggerFactory::getInstance().setConfigFile(config);
104
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
115
116static inline void
117ignoreRibAndLogSections(const std::string& filename, const std::string& sectionName,
118 const ConfigSection& section, bool isDryRun)
119{
120 // Ignore "log" and "rib" sections, but raise an error if we're missing a
121 // handler for an NFD section.
122 if (sectionName == "rib" || sectionName == "log") {
123 // do nothing
124 }
125 else {
126 // missing NFD section
127 ConfigFile::throwErrorOnUnknownSection(filename, sectionName, section, isDryRun);
128 }
129}
130
131void
132Nfd::initializeManagement()
133{
134 m_internalFace = make_shared<InternalFace>();
Yanbiao Li4ee73d42015-08-19 16:30:16 -0700135 m_forwarder->getFaceTable().addReserved(m_internalFace, FACEID_INTERNAL_FACE);
136 m_internalClientFace = makeInternalClientFace(m_internalFace, m_keyChain);
Yanbiao Li698f4fe2015-08-19 16:30:16 -0700137 m_dispatcher.reset(new ndn::mgmt::Dispatcher(*m_internalClientFace, m_keyChain));
138
139 m_validator.reset(new CommandValidator());
Alexander Afanasyev31c781e2015-02-09 17:39:59 -0800140
Yanbiao Li711c7932015-08-19 16:30:16 -0700141 m_fibManager.reset(new FibManager(m_forwarder->getFib(),
142 bind(&Forwarder::getFace, m_forwarder.get(), _1),
143 *m_dispatcher,
144 *m_validator));
Alexander Afanasyev31c781e2015-02-09 17:39:59 -0800145
Yanbiao Li73860e32015-08-19 16:30:16 -0700146 m_faceManager.reset(new FaceManager(m_forwarder->getFaceTable(),
147 *m_dispatcher,
148 *m_validator));
Alexander Afanasyev31c781e2015-02-09 17:39:59 -0800149
Yanbiao Li36f35002015-08-19 16:30:16 -0700150 // m_strategyChoiceManager.reset(new StrategyChoiceManager(m_forwarder->getStrategyChoice(),
151 // m_internalFace, m_keyChain));
Alexander Afanasyev31c781e2015-02-09 17:39:59 -0800152
Yanbiao Li7cec7ea2015-08-19 16:30:16 -0700153 m_forwarderStatusManager.reset(new ForwarderStatusManager(*m_forwarder, *m_dispatcher));
Alexander Afanasyev31c781e2015-02-09 17:39:59 -0800154
155 ConfigFile config(&ignoreRibAndLogSections);
156 general::setConfigFile(config);
157
158 TablesConfigSection tablesConfig(m_forwarder->getCs(),
159 m_forwarder->getPit(),
160 m_forwarder->getFib(),
161 m_forwarder->getStrategyChoice(),
162 m_forwarder->getMeasurements());
163 tablesConfig.setConfigFile(config);
164
Yanbiao Li698f4fe2015-08-19 16:30:16 -0700165 m_validator->setConfigFile(config);
Alexander Afanasyev31c781e2015-02-09 17:39:59 -0800166
Yanbiao Li73860e32015-08-19 16:30:16 -0700167 m_faceManager->setConfigFile(config);
Alexander Afanasyev31c781e2015-02-09 17:39:59 -0800168
169 // parse config file
170 if (!m_configFile.empty()) {
171 config.parse(m_configFile, true);
172 config.parse(m_configFile, false);
173 }
174 else {
175 config.parse(m_configSection, true, INTERNAL_CONFIG);
176 config.parse(m_configSection, false, INTERNAL_CONFIG);
177 }
178
179 tablesConfig.ensureTablesAreConfigured();
180
181 // add FIB entry for NFD Management Protocol
Yanbiao Li698f4fe2015-08-19 16:30:16 -0700182 Name topPrefix("/localhost/nfd");
183 auto entry = m_forwarder->getFib().insert(topPrefix).first;
Alexander Afanasyev31c781e2015-02-09 17:39:59 -0800184 entry->addNextHop(m_internalFace, 0);
Yanbiao Li698f4fe2015-08-19 16:30:16 -0700185 m_dispatcher->addTopPrefix(topPrefix, false);
Alexander Afanasyev31c781e2015-02-09 17:39:59 -0800186}
187
188void
189Nfd::reloadConfigFile()
190{
191 // Logging
192 initializeLogging();
193 /// \todo Reopen log file
194
195 // Other stuff
196 ConfigFile config(&ignoreRibAndLogSections);
197
198 general::setConfigFile(config);
199
200 TablesConfigSection tablesConfig(m_forwarder->getCs(),
201 m_forwarder->getPit(),
202 m_forwarder->getFib(),
203 m_forwarder->getStrategyChoice(),
204 m_forwarder->getMeasurements());
205
206 tablesConfig.setConfigFile(config);
207
Yanbiao Li698f4fe2015-08-19 16:30:16 -0700208 m_validator->setConfigFile(config);
Yanbiao Li73860e32015-08-19 16:30:16 -0700209 m_faceManager->setConfigFile(config);
Alexander Afanasyev31c781e2015-02-09 17:39:59 -0800210
211 if (!m_configFile.empty()) {
212 config.parse(m_configFile, false);
213 }
214 else {
215 config.parse(m_configSection, false, INTERNAL_CONFIG);
216 }
217}
218
Alexander Afanasyev3f41ade2015-06-29 18:31:22 -0700219void
220Nfd::reloadConfigFileFaceSection()
221{
222 // reload only face_system section of the config file to re-initialize multicast faces
223 ConfigFile config(&ConfigFile::ignoreUnknownSection);
Yanbiao Li73860e32015-08-19 16:30:16 -0700224 m_faceManager->setConfigFile(config);
Alexander Afanasyev3f41ade2015-06-29 18:31:22 -0700225
226 if (!m_configFile.empty()) {
227 config.parse(m_configFile, false);
228 }
229 else {
230 config.parse(m_configSection, false, INTERNAL_CONFIG);
231 }
232}
233
Alexander Afanasyev31c781e2015-02-09 17:39:59 -0800234} // namespace nfd