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 
122  {
123  return m_confParam;
124  }
125 
126  const ConfParameter&
128  {
129  return m_confParam;
130  }
131 
134  {
135  return m_adjacencyList;
136  }
137 
138  const AdjacencyList&
140  {
141  return m_adjacencyList;
142  }
143 
146  {
147  return m_namePrefixList;
148  }
149 
150  const NamePrefixList&
152  {
153  return m_namePrefixList;
154  }
155 
156  ndn::Face&
158  {
159  return m_nlsrFace;
160  }
161 
162  Lsdb&
164  {
165  return m_nlsrLsdb;
166  }
167 
168  RoutingTable&
170  {
171  return m_routingTable;
172  }
173 
176  {
177  return m_namePrefixTable;
178  }
179 
180  Fib&
182  {
183  return m_fib;
184  }
185 
186  long int
188  {
189  return m_adjBuildCount;
190  }
191 
192  void
194  {
195  m_adjBuildCount++;
196  }
197 
198  void
199  setAdjBuildCount(int64_t abc)
200  {
201  m_adjBuildCount = abc;
202  }
203 
204  bool
206  {
207  return m_isBuildAdjLsaSheduled;
208  }
209 
210  void
212  {
213  m_isBuildAdjLsaSheduled = iabls;
214  }
215 
216  bool
218  {
219  return m_isRoutingTableCalculating;
220  }
221 
222  void
224  {
225  m_isRoutingTableCalculating = irtc;
226  }
227 
228  bool
230  {
231  return m_isRouteCalculationScheduled;
232  }
233 
234  void
236  {
237  m_isRouteCalculationScheduled = ircs;
238  }
239 
242  {
243  return m_datasetHandler;
244  }
245 
246  void
247  initialize();
248 
259  void
260  initializeFaces(const FetchDatasetCallback& onFetchSuccess,
261  const FetchDatasetTimeoutCallback& onFetchFailure);
262 
263  void
264  onFaceDatasetFetchTimeout(uint32_t code,
265  const std::string& reason,
266  uint32_t nRetriesSoFar);
267 
278  void
279  processFaceDataset(const std::vector<ndn::nfd::FaceStatus>& faces);
280 
290  void
292  const ndn::time::milliseconds& timeout);
293 
298  void
299  loadCertToPublish(const ndn::security::v2::Certificate& certificate);
300 
301  void
302  connectToFetcher(ndn::util::SegmentFetcher& fetcher);
303 
306  void
307  afterFetcherSignalEmitted(const ndn::Data& lsaSegment);
308 
313  void
314  publishCertFromCache(const ndn::Name& keyName);
315 
316  void
317  initializeKey();
318 
319  void
320  loadValidator(boost::property_tree::ptree section,
321  const std::string& filename)
322  {
323  m_validator.load(section, filename);
324  }
325 
326  ndn::security::ValidatorConfig&
328  {
329  return m_validator;
330  }
331 
340  const ndn::security::v2::Certificate*
341  getCertificate(const ndn::Name& certificateKeyName)
342  {
343  const ndn::security::v2::Certificate* cert =
344  m_certStore.find(certificateKeyName);
345 
346  return cert;
347  }
348 
349  ndn::security::v2::KeyChain&
351  {
352  return m_keyChain;
353  }
354 
355  const ndn::Name&
357  {
358  return m_defaultCertName;
359  }
360 
361  const ndn::security::SigningInfo&
363  {
364  return m_signingInfo;
365  }
366 
369  {
370  return m_prefixUpdateProcessor;
371  }
372 
375  {
376  return m_nfdRibCommandProcessor;
377  }
378 
379  ndn::mgmt::Dispatcher&
381  {
382  return m_dispatcher;
383  }
384 
385  void
386  setStrategies();
387 
388  uint32_t
390  {
391  return m_firstHelloInterval;
392  }
393 
409  void
410  canonizeNeighborUris(std::list<Adjacent>::iterator currentNeighbor,
411  std::function<void(std::list<Adjacent>::iterator)> then,
412  std::function<void(void)> finally);
413 
416  {
417  return m_statsCollector;
418  }
419 
421 
423  getCertificateStore()
424  {
425  return m_certStore;
426  }
427 
428 private:
431  void
432  registerKeyPrefix();
433 
436  void
437  registerLocalhostPrefix();
438 
441  void
442  onKeyInterest(const ndn::Name& name, const ndn::Interest& interest);
443 
446  void
447  onKeyPrefixRegSuccess(const ndn::Name& name);
448 
451  void
452  onFaceEventNotification(const ndn::nfd::FaceEventNotification& faceEventNotification);
453 
454  void
455  setFirstHelloInterval(uint32_t interval)
456  {
457  m_firstHelloInterval = interval;
458  }
459 
467  void
468  canonizeContinuation(std::list<Adjacent>::iterator iterator,
469  std::function<void(void)> finally);
470 
471  void
472  scheduleDatasetFetch();
473 
481  void
482  enableIncomingFaceIdIndication();
483 
484  void
485  onFaceIdIndicationSuccess(const ndn::nfd::ControlParameters& cp);
486 
487  void
488  onFaceIdIndicationFailure(const ndn::nfd::ControlResponse& cr);
489 
490 public:
491  static const ndn::Name LOCALHOST_PREFIX;
492 
493 private:
494  ndn::Face& m_nlsrFace;
495  ndn::Scheduler& m_scheduler;
496  ndn::security::v2::KeyChain& m_keyChain;
497  ConfParameter m_confParam;
498  AdjacencyList m_adjacencyList;
499  NamePrefixList m_namePrefixList;
500  std::string m_configFileName;
501  Lsdb m_nlsrLsdb;
502  int64_t m_adjBuildCount;
503  bool m_isBuildAdjLsaSheduled;
504  bool m_isRouteCalculationScheduled;
505  bool m_isRoutingTableCalculating;
506  RoutingTable m_routingTable;
507  Fib m_fib;
508  NamePrefixTable m_namePrefixTable;
509 
510  ndn::mgmt::Dispatcher m_dispatcher;
511 
512  DatasetInterestHandler m_datasetHandler;
513 
515  HelloProtocol m_helloProtocol;
516 
517  ndn::security::ValidatorConfig m_validator;
518 
519 private:
523  security::CertificateStore m_certStore;
524 
525  ndn::nfd::Controller m_controller;
526  ndn::nfd::Controller m_faceDatasetController;
527  ndn::security::SigningInfo m_signingInfo;
528  ndn::Name m_defaultCertName;
529  update::PrefixUpdateProcessor m_prefixUpdateProcessor;
530  update::NfdRibCommandProcessor m_nfdRibCommandProcessor;
531  StatsCollector m_statsCollector;
532 
533  ndn::nfd::FaceMonitor m_faceMonitor;
534 
535  uint32_t m_firstHelloInterval;
536 
537  friend class NlsrRunner;
538 };
539 
540 } // namespace nlsr
541 
542 #endif // NLSR_NLSR_HPP
const AdjacencyList & getAdjacencyList() const
Definition: nlsr.hpp:139
void initializeFaces(const FetchDatasetCallback &onFetchSuccess, const FetchDatasetTimeoutCallback &onFetchFailure)
Initializes neighbors&#39; Faces using information from NFD.
Definition: nlsr.cpp:545
void onFaceDatasetFetchTimeout(uint32_t code, const std::string &reason, uint32_t nRetriesSoFar)
Definition: nlsr.cpp:609
A class to house all the configuration parameters for NLSR.
Class to publish all dataset.
bool getIsBuildAdjLsaSheduled()
Definition: nlsr.hpp:205
std::string getConfFileName() const
Definition: nlsr.hpp:109
void initialize()
Definition: nlsr.cpp:250
std::function< void(uint32_t, const std::string &)> FetchDatasetTimeoutCallback
Definition: nlsr.hpp:71
Store certificates for names.
#define PUBLIC_WITH_TESTS_ELSE_PRIVATE
ConfParameter & getConfParameter()
Definition: nlsr.hpp:121
A wrapper class to instantiate and configure an NLSR object.
Definition: nlsr-runner.hpp:44
void setStrategies()
Definition: nlsr.cpp:143
DatasetInterestHandler & getDatasetHandler()
Definition: nlsr.hpp:241
Error(const std::string &what)
Definition: nlsr.hpp:77
NamePrefixTable & getNamePrefixTable()
Definition: nlsr.hpp:175
update::NfdRibCommandProcessor & getNfdRibCommandProcessor()
Definition: nlsr.hpp:374
void connectToFetcher(ndn::util::SegmentFetcher &fetcher)
Definition: nlsr.cpp:201
STL namespace.
std::function< void(const std::vector< ndn::nfd::FaceStatus > &)> FetchDatasetCallback
Definition: nlsr.hpp:70
void incrementAdjBuildCount()
Definition: nlsr.hpp:193
uint32_t getFirstHelloInterval() const
Definition: nlsr.hpp:389
RoutingTable & getRoutingTable()
Definition: nlsr.hpp:169
const ConfParameter & getConfParameter() const
Definition: nlsr.hpp:127
StatsCollector & getStatsCollector()
Definition: nlsr.hpp:415
Maps names to lists of next hops, and exports this information to NFD.
Definition: fib.hpp:54
void setLsaInterestFilter()
Definition: nlsr.cpp:115
void addDispatcherTopPrefix(const ndn::Name &topPrefix)
Add top level prefixes for Dispatcher.
Definition: nlsr.cpp:132
static const ndn::Name LOCALHOST_PREFIX
Definition: nlsr.hpp:491
void registerAdjacencyPrefixes(const Adjacent &adj, const ndn::time::milliseconds &timeout)
Registers NLSR-specific prefixes for a neighbor (Adjacent)
Definition: nlsr.cpp:589
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:162
AdjacencyList & getAdjacencyList()
Definition: nlsr.hpp:133
const ndn::Name & getDefaultCertName()
Definition: nlsr.hpp:356
void setIsRouteCalculationScheduled(bool ircs)
Definition: nlsr.hpp:235
void setAdjBuildCount(int64_t abc)
Definition: nlsr.hpp:199
bool getIsRoutingTableCalculating()
Definition: nlsr.hpp:217
const NamePrefixList & getNamePrefixList() const
Definition: nlsr.hpp:151
void onRegistrationSuccess(const ndn::Name &name)
Definition: nlsr.cpp:91
ndn::security::v2::KeyChain & getKeyChain()
Definition: nlsr.hpp:350
ndn::mgmt::Dispatcher & getDispatcher()
Definition: nlsr.hpp:380
void loadCertToPublish(const ndn::security::v2::Certificate &certificate)
Add a certificate NLSR claims to be authoritative for to the certificate store.
Definition: nlsr.cpp:189
void setConfFileName(const std::string &fileName)
Definition: nlsr.hpp:115
void publishCertFromCache(const ndn::Name &keyName)
Retrieves the chain of certificates from Validator&#39;s cache and store them in Nlsr&#39;s own CertificateSt...
Definition: nlsr.cpp:223
update::PrefixUpdateProcessor & getPrefixUpdateProcessor()
Definition: nlsr.hpp:368
void setInfoInterestFilter()
Definition: nlsr.cpp:97
void afterFetcherSignalEmitted(const ndn::Data &lsaSegment)
Callback when SegmentFetcher retrieves a segment.
Definition: nlsr.cpp:210
bool getIsRouteCalculationScheduled()
Definition: nlsr.hpp:229
void loadValidator(boost::property_tree::ptree section, const std::string &filename)
Definition: nlsr.hpp:320
void setIsBuildAdjLsaSheduled(bool iabls)
Definition: nlsr.hpp:211
A neighbor reachable over a Face.
Definition: adjacent.hpp:38
Copyright (c) 2014-2018, The University of Memphis, Regents of the University of California, Arizona Board of Regents.
void registrationFailed(const ndn::Name &name)
Definition: nlsr.cpp:84
Copyright (c) 2014-2018, 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:163
void startEventLoop()
Definition: nlsr.cpp:679
void setIsRoutingTableCalculating(bool irtc)
Definition: nlsr.hpp:223
long int getAdjBuildCount()
Definition: nlsr.hpp:187
const ndn::security::v2::Certificate * getCertificate(const ndn::Name &certificateKeyName)
Find a certificate.
Definition: nlsr.hpp:341
ndn::Face & getNlsrFace()
Definition: nlsr.hpp:157
Nlsr(boost::asio::io_service &ioService, ndn::Scheduler &scheduler, ndn::Face &face, ndn::KeyChain &keyChain)
Definition: nlsr.cpp:42
static ndn::Name DEFAULT_BROADCAST_PREFIX("/ndn/broadcast")
const ndn::security::SigningInfo & getSigningInfo()
Definition: nlsr.hpp:362
ndn::security::ValidatorConfig & getValidator()
Definition: nlsr.hpp:327
void processFaceDataset(const std::vector< ndn::nfd::FaceStatus > &faces)
Consumes a Face StatusDataset to configure NLSR neighbors.
Definition: nlsr.cpp:555
Fib & getFib()
Definition: nlsr.hpp:181
void initializeKey()
Definition: nlsr.cpp:317