nlsr.hpp
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
22 #ifndef NLSR_NLSR_HPP
23 #define NLSR_NLSR_HPP
24 
25 #include "adjacency-list.hpp"
26 #include "common.hpp"
27 #include "conf-parameter.hpp"
28 #include "hello-protocol.hpp"
29 #include "lsdb.hpp"
30 #include "name-prefix-list.hpp"
31 #include "test-access-control.hpp"
33 #include "route/fib.hpp"
35 #include "route/routing-table.hpp"
39 #include "utility/name-helper.hpp"
40 #include "stats-collector.hpp"
41 
42 #include <boost/cstdint.hpp>
43 #include <stdexcept>
44 #include <boost/throw_exception.hpp>
45 
46 #include <ndn-cxx/face.hpp>
47 #include <ndn-cxx/security/key-chain.hpp>
48 #include <ndn-cxx/security/validator-config.hpp>
49 #include <ndn-cxx/security/v2/certificate-fetcher-direct-fetch.hpp>
50 #include <ndn-cxx/security/signing-helpers.hpp>
51 #include <ndn-cxx/security/signing-info.hpp>
52 #include <ndn-cxx/util/scheduler.hpp>
53 #include <ndn-cxx/mgmt/nfd/face-event-notification.hpp>
54 #include <ndn-cxx/mgmt/nfd/face-monitor.hpp>
55 #include <ndn-cxx/mgmt/dispatcher.hpp>
56 #include <ndn-cxx/mgmt/nfd/face-status.hpp>
57 #include <ndn-cxx/data.hpp>
58 #include <ndn-cxx/encoding/block.hpp>
59 #include <ndn-cxx/encoding/nfd-constants.hpp>
60 #include <ndn-cxx/mgmt/nfd/control-parameters.hpp>
61 #include <ndn-cxx/mgmt/nfd/control-response.hpp>
62 
63 namespace nlsr {
64 
65 static ndn::Name DEFAULT_BROADCAST_PREFIX("/ndn/broadcast");
66 
67 class Nlsr
68 {
69 public:
70  using FetchDatasetCallback = std::function<void(const std::vector<ndn::nfd::FaceStatus>&)>;
71  using FetchDatasetTimeoutCallback = std::function<void(uint32_t, const std::string&)>;
72 
73  class Error : public std::runtime_error
74  {
75  public:
76  explicit
77  Error(const std::string& what)
78  : std::runtime_error(what)
79  {
80  }
81  };
82 
83  Nlsr(boost::asio::io_service& ioService, ndn::Scheduler& scheduler, ndn::Face& face, ndn::KeyChain& keyChain);
84 
85  void
86  registrationFailed(const ndn::Name& name);
87 
88  void
89  onRegistrationSuccess(const ndn::Name& name);
90 
91  void
93 
94  void
96 
102  void
103  addDispatcherTopPrefix(const ndn::Name& topPrefix);
104 
105  void
106  startEventLoop();
107 
108  std::string
110  {
111  return m_configFileName;
112  }
113 
114  void
115  setConfFileName(const std::string& fileName)
116  {
117  m_configFileName = fileName;
118  }
119 
120  bool
122  {
123  return m_isDaemonProcess;
124  }
125 
126  void
127  setIsDaemonProcess(bool value)
128  {
129  m_isDaemonProcess = value;
130  }
131 
134  {
135  return m_confParam;
136  }
137 
140  {
141  return m_adjacencyList;
142  }
143 
146  {
147  return m_namePrefixList;
148  }
149 
150  ndn::Face&
152  {
153  return m_nlsrFace;
154  }
155 
156  Lsdb&
158  {
159  return m_nlsrLsdb;
160  }
161 
162  RoutingTable&
164  {
165  return m_routingTable;
166  }
167 
170  {
171  return m_namePrefixTable;
172  }
173 
174  Fib&
176  {
177  return m_fib;
178  }
179 
180  long int
182  {
183  return m_adjBuildCount;
184  }
185 
186  void
188  {
189  m_adjBuildCount++;
190  }
191 
192  void
193  setAdjBuildCount(int64_t abc)
194  {
195  m_adjBuildCount = abc;
196  }
197 
198  bool
200  {
201  return m_isBuildAdjLsaSheduled;
202  }
203 
204  void
206  {
207  m_isBuildAdjLsaSheduled = iabls;
208  }
209 
210  bool
212  {
213  return m_isRoutingTableCalculating;
214  }
215 
216  void
218  {
219  m_isRoutingTableCalculating = irtc;
220  }
221 
222  bool
224  {
225  return m_isRouteCalculationScheduled;
226  }
227 
228  void
230  {
231  m_isRouteCalculationScheduled = ircs;
232  }
233 
236  {
237  return m_lsdbDatasetHandler;
238  }
239 
240  void
241  initialize();
242 
253  void
254  initializeFaces(const FetchDatasetCallback& onFetchSuccess,
255  const FetchDatasetTimeoutCallback& onFetchFailure);
256 
257  void
258  onFaceDatasetFetchTimeout(uint32_t code,
259  const std::string& reason,
260  uint32_t nRetriesSoFar);
261 
272  void
273  processFaceDataset(const std::vector<ndn::nfd::FaceStatus>& faces);
274 
284  void
286  const ndn::time::milliseconds& timeout);
287 
292  void
293  loadCertToPublish(const ndn::security::v2::Certificate& certificate);
294 
295  void
296  initializeKey();
297 
298  void
299  loadValidator(boost::property_tree::ptree section,
300  const std::string& filename)
301  {
302  m_validator.load(section, filename);
303  }
304 
305  ndn::security::ValidatorConfig&
307  {
308  return m_validator;
309  }
310 
319  const ndn::security::v2::Certificate*
320  getCertificate(const ndn::Name& certificateKeyName)
321  {
322  const ndn::security::v2::Certificate* cert =
323  m_certStore.find(certificateKeyName);
324 
325  return cert;
326  }
327 
328  ndn::security::v2::KeyChain&
330  {
331  return m_keyChain;
332  }
333 
334  const ndn::Name&
336  {
337  return m_defaultCertName;
338  }
339 
340  const ndn::security::SigningInfo&
342  {
343  return m_signingInfo;
344  }
345 
348  {
349  return m_prefixUpdateProcessor;
350  }
351 
354  {
355  return m_nfdRibCommandProcessor;
356  }
357 
358  ndn::mgmt::Dispatcher&
360  {
361  return m_localhostDispatcher;
362  }
363 
364  ndn::mgmt::Dispatcher&
366  {
367  return m_routerNameDispatcher;
368  }
369 
370  void
371  setStrategies();
372 
373  void
374  daemonize();
375 
376  uint32_t
378  {
379  return m_firstHelloInterval;
380  }
381 
397  void
398  canonizeNeighborUris(std::list<Adjacent>::iterator currentNeighbor,
399  std::function<void(std::list<Adjacent>::iterator)> then,
400  std::function<void(void)> finally);
401 
404  {
405  return m_statsCollector;
406  }
407 
409 
411  getCertificateStore()
412  {
413  return m_certStore;
414  }
415 
416 private:
419  void
420  registerKeyPrefix();
421 
424  void
425  registerLocalhostPrefix();
426 
429  void
430  onKeyInterest(const ndn::Name& name, const ndn::Interest& interest);
431 
434  void
435  onKeyPrefixRegSuccess(const ndn::Name& name);
436 
439  void
440  onFaceEventNotification(const ndn::nfd::FaceEventNotification& faceEventNotification);
441 
442  void
443  setFirstHelloInterval(uint32_t interval)
444  {
445  m_firstHelloInterval = interval;
446  }
447 
455  void
456  canonizeContinuation(std::list<Adjacent>::iterator iterator,
457  std::function<void(void)> finally);
458 
459  void
460  scheduleDatasetFetch();
461 
469  void
470  enableIncomingFaceIdIndication();
471 
472  void
473  onFaceIdIndicationSuccess(const ndn::nfd::ControlParameters& cp);
474 
475  void
476  onFaceIdIndicationFailure(const ndn::nfd::ControlResponse& cr);
477 
478 public:
479  static const ndn::Name LOCALHOST_PREFIX;
480 
481 private:
482  ndn::Face& m_nlsrFace;
483  ndn::Scheduler& m_scheduler;
484  ndn::security::v2::KeyChain& m_keyChain;
485  ConfParameter m_confParam;
486  AdjacencyList m_adjacencyList;
487  NamePrefixList m_namePrefixList;
488  bool m_isDaemonProcess;
489  std::string m_configFileName;
490  Lsdb m_nlsrLsdb;
491  int64_t m_adjBuildCount;
492  bool m_isBuildAdjLsaSheduled;
493  bool m_isRouteCalculationScheduled;
494  bool m_isRoutingTableCalculating;
495  RoutingTable m_routingTable;
496  Fib m_fib;
497  NamePrefixTable m_namePrefixTable;
498 
499  ndn::mgmt::Dispatcher m_localhostDispatcher;
500  ndn::mgmt::Dispatcher m_routerNameDispatcher;
501 
502  LsdbDatasetInterestHandler m_lsdbDatasetHandler;
503 
505  HelloProtocol m_helloProtocol;
506 
507  ndn::security::ValidatorConfig m_validator;
508 
509 private:
513  security::CertificateStore m_certStore;
514 
515  ndn::nfd::Controller m_controller;
516  ndn::nfd::Controller m_faceDatasetController;
517  ndn::security::SigningInfo m_signingInfo;
518  ndn::Name m_defaultCertName;
519  update::PrefixUpdateProcessor m_prefixUpdateProcessor;
520  update::NfdRibCommandProcessor m_nfdRibCommandProcessor;
521  StatsCollector m_statsCollector;
522 
523  ndn::nfd::FaceMonitor m_faceMonitor;
524 
525  uint32_t m_firstHelloInterval;
526 
527  friend class NlsrRunner;
528 };
529 
530 } // namespace nlsr
531 
532 #endif // NLSR_NLSR_HPP
void initializeFaces(const FetchDatasetCallback &onFetchSuccess, const FetchDatasetTimeoutCallback &onFetchFailure)
Initializes neighbors&#39; Faces using information from NFD.
Definition: nlsr.cpp:521
void onFaceDatasetFetchTimeout(uint32_t code, const std::string &reason, uint32_t nRetriesSoFar)
Definition: nlsr.cpp:585
ndn::mgmt::Dispatcher & getLocalhostDispatcher()
Definition: nlsr.hpp:359
A class to house all the configuration parameters for NLSR.
bool getIsBuildAdjLsaSheduled()
Definition: nlsr.hpp:199
std::string getConfFileName() const
Definition: nlsr.hpp:109
void initialize()
Definition: nlsr.cpp:235
std::function< void(uint32_t, const std::string &)> FetchDatasetTimeoutCallback
Definition: nlsr.hpp:71
Class to publish all lsa dataset.
Store certificates for names.
#define PUBLIC_WITH_TESTS_ELSE_PRIVATE
ConfParameter & getConfParameter()
Definition: nlsr.hpp:133
void setIsDaemonProcess(bool value)
Definition: nlsr.hpp:127
A wrapper class to instantiate and configure an NLSR object.
Definition: nlsr-runner.hpp:44
void setStrategies()
Definition: nlsr.cpp:151
Error(const std::string &what)
Definition: nlsr.hpp:77
NamePrefixTable & getNamePrefixTable()
Definition: nlsr.hpp:169
update::NfdRibCommandProcessor & getNfdRibCommandProcessor()
Definition: nlsr.hpp:353
ndn::mgmt::Dispatcher & getRouterNameDispatcher()
Definition: nlsr.hpp:365
STL namespace.
std::function< void(const std::vector< ndn::nfd::FaceStatus > &)> FetchDatasetCallback
Definition: nlsr.hpp:70
void incrementAdjBuildCount()
Definition: nlsr.hpp:187
uint32_t getFirstHelloInterval() const
Definition: nlsr.hpp:377
RoutingTable & getRoutingTable()
Definition: nlsr.hpp:163
StatsCollector & getStatsCollector()
Definition: nlsr.hpp:403
LsdbDatasetInterestHandler & getLsdbDatasetHandler()
Definition: nlsr.hpp:235
Maps names to lists of next hops, and exports this information to NFD.
Definition: fib.hpp:54
bool getIsSetDaemonProcess()
Definition: nlsr.hpp:121
void setLsaInterestFilter()
Definition: nlsr.cpp:116
void addDispatcherTopPrefix(const ndn::Name &topPrefix)
Add top level prefixes for Dispatcher.
Definition: nlsr.cpp:135
static const ndn::Name LOCALHOST_PREFIX
Definition: nlsr.hpp:479
void registerAdjacencyPrefixes(const Adjacent &adj, const ndn::time::milliseconds &timeout)
Registers NLSR-specific prefixes for a neighbor (Adjacent)
Definition: nlsr.cpp:565
Copyright (c) 2014-2017, The University of Memphis, Regents of the University of California.
void canonizeNeighborUris(std::list< Adjacent >::iterator currentNeighbor, std::function< void(std::list< Adjacent >::iterator)> then, std::function< void(void)> finally)
Canonize the URI for this and all proceeding neighbors in a list.
Definition: nlsr.cpp:196
AdjacencyList & getAdjacencyList()
Definition: nlsr.hpp:139
const ndn::Name & getDefaultCertName()
Definition: nlsr.hpp:335
void setIsRouteCalculationScheduled(bool ircs)
Definition: nlsr.hpp:229
void daemonize()
Definition: nlsr.cpp:160
void setAdjBuildCount(int64_t abc)
Definition: nlsr.hpp:193
bool getIsRoutingTableCalculating()
Definition: nlsr.hpp:211
void onRegistrationSuccess(const ndn::Name &name)
Definition: nlsr.cpp:92
ndn::security::v2::KeyChain & getKeyChain()
Definition: nlsr.hpp:329
void loadCertToPublish(const ndn::security::v2::Certificate &certificate)
Add a certificate NLSR claims to be authoritative for to the certificate store.
Definition: nlsr.cpp:224
void setConfFileName(const std::string &fileName)
Definition: nlsr.hpp:115
update::PrefixUpdateProcessor & getPrefixUpdateProcessor()
Definition: nlsr.hpp:347
void setInfoInterestFilter()
Definition: nlsr.cpp:98
bool getIsRouteCalculationScheduled()
Definition: nlsr.hpp:223
void loadValidator(boost::property_tree::ptree section, const std::string &filename)
Definition: nlsr.hpp:299
void setIsBuildAdjLsaSheduled(bool iabls)
Definition: nlsr.hpp:205
A neighbor reachable over a Face.
Definition: adjacent.hpp:38
void registrationFailed(const ndn::Name &name)
Definition: nlsr.cpp:85
Copyright (c) 2014-2017, The University of Memphis, Regents of the University of California, Arizona Board of Regents.
NamePrefixList & getNamePrefixList()
Definition: nlsr.hpp:145
Lsdb & getLsdb()
Definition: nlsr.hpp:157
void startEventLoop()
Definition: nlsr.cpp:655
void setIsRoutingTableCalculating(bool irtc)
Definition: nlsr.hpp:217
long int getAdjBuildCount()
Definition: nlsr.hpp:181
const ndn::security::v2::Certificate * getCertificate(const ndn::Name &certificateKeyName)
Find a certificate.
Definition: nlsr.hpp:320
ndn::Face & getNlsrFace()
Definition: nlsr.hpp:151
Nlsr(boost::asio::io_service &ioService, ndn::Scheduler &scheduler, ndn::Face &face, ndn::KeyChain &keyChain)
Definition: nlsr.cpp:41
static ndn::Name DEFAULT_BROADCAST_PREFIX("/ndn/broadcast")
const ndn::security::SigningInfo & getSigningInfo()
Definition: nlsr.hpp:341
ndn::security::ValidatorConfig & getValidator()
Definition: nlsr.hpp:306
void processFaceDataset(const std::vector< ndn::nfd::FaceStatus > &faces)
Consumes a Face StatusDataset to configure NLSR neighbors.
Definition: nlsr.cpp:531
Fib & getFib()
Definition: nlsr.hpp:175
void initializeKey()
Definition: nlsr.cpp:301