NS-3 based Named Data Networking (NDN) simulator
ndnSIM 2.0: NDN, CCN, CCNx, content centric networks
API Documentation
nfd.cpp
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
26 #include "nfd.hpp"
27 
28 #include "core/global-io.hpp"
29 #include "core/logger-factory.hpp"
31 #include "core/config-file.hpp"
32 #include "fw/forwarder.hpp"
33 #include "face/null-face.hpp"
34 #include "mgmt/internal-face.hpp"
35 #include "mgmt/fib-manager.hpp"
36 #include "mgmt/face-manager.hpp"
38 #include "mgmt/status-server.hpp"
41 
42 namespace nfd {
43 
44 NFD_LOG_INIT("Nfd");
45 
46 static const std::string INTERNAL_CONFIG = "internal://nfd.conf";
47 
48 Nfd::Nfd(const std::string& configFile, ndn::KeyChain& keyChain)
49  : m_configFile(configFile)
50  , m_keyChain(keyChain)
51  , m_networkMonitor(getGlobalIoService())
52 {
53 }
54 
55 Nfd::Nfd(const ConfigSection& config, ndn::KeyChain& keyChain)
56  : m_configSection(config)
57  , m_keyChain(keyChain)
58  , m_networkMonitor(getGlobalIoService())
59 {
60 }
61 
63 {
64  // It is necessary to explicitly define the destructor, because some member variables (e.g.,
65  // unique_ptr<Forwarder>) are forward-declared, but implicitly declared destructor requires
66  // complete types for all members when instantiated.
67 }
68 
69 void
71 {
72  initializeLogging();
73 
74  m_forwarder.reset(new Forwarder());
75 
76  initializeManagement();
77 
78  m_forwarder->getFaceTable().addReserved(make_shared<NullFace>(), FACEID_NULL);
79  m_forwarder->getFaceTable().addReserved(make_shared<NullFace>(FaceUri("contentstore://")),
81 
83 
84  m_networkMonitor.onNetworkStateChanged.connect([this] {
85  // delay stages, so if multiple events are triggered in short sequence,
86  // only one auto-detection procedure is triggered
87  m_reloadConfigEvent = scheduler::schedule(time::seconds(5),
88  [this] {
89  NFD_LOG_INFO("Network change detected, reloading face section of the config file...");
90  this->reloadConfigFileFaceSection();
91  });
92  });
93 }
94 
95 void
96 Nfd::initializeLogging()
97 {
99  LoggerFactory::getInstance().setConfigFile(config);
100 
101  if (!m_configFile.empty()) {
102  config.parse(m_configFile, true);
103  config.parse(m_configFile, false);
104  }
105  else {
106  config.parse(m_configSection, true, INTERNAL_CONFIG);
107  config.parse(m_configSection, false, INTERNAL_CONFIG);
108  }
109 }
110 
111 
112 static inline void
113 ignoreRibAndLogSections(const std::string& filename, const std::string& sectionName,
114  const ConfigSection& section, bool isDryRun)
115 {
116  // Ignore "log" and "rib" sections, but raise an error if we're missing a
117  // handler for an NFD section.
118  if (sectionName == "rib" || sectionName == "log") {
119  // do nothing
120  }
121  else {
122  // missing NFD section
123  ConfigFile::throwErrorOnUnknownSection(filename, sectionName, section, isDryRun);
124  }
125 }
126 
127 void
128 Nfd::initializeManagement()
129 {
130  m_internalFace = make_shared<InternalFace>();
131 
132  m_fibManager.reset(new FibManager(m_forwarder->getFib(),
133  bind(&Forwarder::getFace, m_forwarder.get(), _1),
134  m_internalFace, m_keyChain));
135 
136  m_faceManager.reset(new FaceManager(m_forwarder->getFaceTable(), m_internalFace, m_keyChain));
137 
138  m_strategyChoiceManager.reset(new StrategyChoiceManager(m_forwarder->getStrategyChoice(),
139  m_internalFace, m_keyChain));
140 
141  m_statusServer.reset(new StatusServer(m_internalFace, *m_forwarder, m_keyChain));
142 
144  general::setConfigFile(config);
145 
146  TablesConfigSection tablesConfig(m_forwarder->getCs(),
147  m_forwarder->getPit(),
148  m_forwarder->getFib(),
149  m_forwarder->getStrategyChoice(),
150  m_forwarder->getMeasurements());
151  tablesConfig.setConfigFile(config);
152 
153  m_internalFace->getValidator().setConfigFile(config);
154 
155  m_forwarder->getFaceTable().addReserved(m_internalFace, FACEID_INTERNAL_FACE);
156 
157  m_faceManager->setConfigFile(config);
158 
159  // parse config file
160  if (!m_configFile.empty()) {
161  config.parse(m_configFile, true);
162  config.parse(m_configFile, false);
163  }
164  else {
165  config.parse(m_configSection, true, INTERNAL_CONFIG);
166  config.parse(m_configSection, false, INTERNAL_CONFIG);
167  }
168 
169  tablesConfig.ensureTablesAreConfigured();
170 
171  // add FIB entry for NFD Management Protocol
172  shared_ptr<fib::Entry> entry = m_forwarder->getFib().insert("/localhost/nfd").first;
173  entry->addNextHop(m_internalFace, 0);
174 }
175 
176 void
178 {
179  // Logging
180  initializeLogging();
182 
183  // Other stuff
185 
186  general::setConfigFile(config);
187 
188  TablesConfigSection tablesConfig(m_forwarder->getCs(),
189  m_forwarder->getPit(),
190  m_forwarder->getFib(),
191  m_forwarder->getStrategyChoice(),
192  m_forwarder->getMeasurements());
193 
194  tablesConfig.setConfigFile(config);
195 
196  m_internalFace->getValidator().setConfigFile(config);
197  m_faceManager->setConfigFile(config);
198 
199  if (!m_configFile.empty()) {
200  config.parse(m_configFile, false);
201  }
202  else {
203  config.parse(m_configSection, false, INTERNAL_CONFIG);
204  }
205 }
206 
207 void
208 Nfd::reloadConfigFileFaceSection()
209 {
210  // reload only face_system section of the config file to re-initialize multicast faces
212  m_faceManager->setConfigFile(config);
213 
214  if (!m_configFile.empty()) {
215  config.parse(m_configFile, false);
216  }
217  else {
218  config.parse(m_configSection, false, INTERNAL_CONFIG);
219  }
220 }
221 
222 } // namespace nfd
const FaceId FACEID_INTERNAL_FACE
identifies the InternalFace used in management
Definition: face.hpp:46
Nfd(const std::string &configFile, ndn::KeyChain &keyChain)
Create NFD instance using absolute or relative path to configFile.
Definition: nfd.cpp:48
static const std::string INTERNAL_CONFIG
Definition: nfd.cpp:46
represents the underlying protocol and address used by a Face
Definition: face-uri.hpp:44
void setConfigFile(ConfigFile &configFile)
static void ignoreRibAndLogSections(const std::string &filename, const std::string &sectionName, const ConfigSection &section, bool isDryRun)
Definition: nfd.cpp:113
FibManager
Definition: fib-manager.cpp:38
#define NFD_LOG_INFO(expression)
Definition: logger.hpp:37
void reloadConfigFile()
Reload configuration file and apply update (if any)
Definition: nfd.cpp:177
static void throwErrorOnUnknownSection(const std::string &filename, const std::string &sectionName, const ConfigSection &section, bool isDryRun)
Definition: config-file.cpp:34
Copyright (c) 2011-2015 Regents of the University of California.
Definition: ndn-common.hpp:38
Signal< NetworkMonitor > onNetworkStateChanged
boost::property_tree::ptree ConfigSection
EventId schedule(const time::nanoseconds &after, const std::function< void()> &event)
schedule an event
Definition: scheduler.cpp:50
Forwarder
Definition: forwarder.cpp:38
shared_ptr< Face > getFace(FaceId id) const
get existing Face
Definition: forwarder.hpp:254
const FaceId FACEID_NULL
identifies the NullFace that drops every packet
Definition: face.hpp:50
void initialize()
Perform initialization of NFD instance After initialization, NFD instance can be started by invoking ...
Definition: nfd.cpp:70
~Nfd()
Destructor.
Definition: nfd.cpp:62
#define NFD_LOG_INIT(name)
Definition: logger.hpp:33
const FaceId FACEID_CONTENT_STORE
identifies a packet comes from the ContentStore, in LocalControlHeader incomingFaceId ...
Definition: face.hpp:48
static void ignoreUnknownSection(const std::string &filename, const std::string &sectionName, const ConfigSection &section, bool isDryRun)
Definition: config-file.cpp:47
boost::asio::io_service & getGlobalIoService()
Definition: global-io.hpp:35
void parse(const std::string &filename, bool isDryRun)
Definition: config-file.cpp:68
void setConfigFile(ConfigFile &configFile)