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  registerRouterPrefix();
443 
446  void
447  onKeyInterest(const ndn::Name& name, const ndn::Interest& interest);
448 
451  void
452  onKeyPrefixRegSuccess(const ndn::Name& name);
453 
456  void
457  onFaceEventNotification(const ndn::nfd::FaceEventNotification& faceEventNotification);
458 
459  void
460  setFirstHelloInterval(uint32_t interval)
461  {
462  m_firstHelloInterval = interval;
463  }
464 
472  void
473  canonizeContinuation(std::list<Adjacent>::iterator iterator,
474  std::function<void(void)> finally);
475 
476  void
477  scheduleDatasetFetch();
478 
486  void
487  enableIncomingFaceIdIndication();
488 
489  void
490  onFaceIdIndicationSuccess(const ndn::nfd::ControlParameters& cp);
491 
492  void
493  onFaceIdIndicationFailure(const ndn::nfd::ControlResponse& cr);
494 
495 public:
496  static const ndn::Name LOCALHOST_PREFIX;
497 
498 private:
499  ndn::Face& m_nlsrFace;
500  ndn::Scheduler& m_scheduler;
501  ndn::security::v2::KeyChain& m_keyChain;
502  ConfParameter m_confParam;
503  AdjacencyList m_adjacencyList;
504  NamePrefixList m_namePrefixList;
505  std::string m_configFileName;
506  Lsdb m_nlsrLsdb;
507  int64_t m_adjBuildCount;
508  bool m_isBuildAdjLsaSheduled;
509  bool m_isRouteCalculationScheduled;
510  bool m_isRoutingTableCalculating;
511  RoutingTable m_routingTable;
512  Fib m_fib;
513  NamePrefixTable m_namePrefixTable;
514 
515  ndn::mgmt::Dispatcher m_dispatcher;
516 
517  DatasetInterestHandler m_datasetHandler;
518 
520  HelloProtocol m_helloProtocol;
521 
522  ndn::security::ValidatorConfig m_validator;
523 
524 private:
528  security::CertificateStore m_certStore;
529 
530  ndn::nfd::Controller m_controller;
531  ndn::nfd::Controller m_faceDatasetController;
532  ndn::security::SigningInfo m_signingInfo;
533  ndn::Name m_defaultCertName;
534  update::PrefixUpdateProcessor m_prefixUpdateProcessor;
535  update::NfdRibCommandProcessor m_nfdRibCommandProcessor;
536  StatsCollector m_statsCollector;
537 
538  ndn::nfd::FaceMonitor m_faceMonitor;
539 
540  uint32_t m_firstHelloInterval;
541 
542  friend class NlsrRunner;
543 };
544 
545 } // namespace nlsr
546 
547 #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:555
void onFaceDatasetFetchTimeout(uint32_t code, const std::string &reason, uint32_t nRetriesSoFar)
Definition: nlsr.cpp:619
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:251
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:144
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:202
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:53
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:496
void registerAdjacencyPrefixes(const Adjacent &adj, const ndn::time::milliseconds &timeout)
Registers NLSR-specific prefixes for a neighbor (Adjacent)
Definition: nlsr.cpp:599
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:163
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:190
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:224
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:211
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:689
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:565
Fib & getFib()
Definition: nlsr.hpp:181
void initializeKey()
Definition: nlsr.cpp:319