blob: 54af8b49fbe240a8b023ad853ef5e08f9924d3c1 [file] [log] [blame]
akmhoque3d06e792014-05-27 16:23:20 -05001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Nick Gordonc6a85222017-01-03 16:54:34 -06003 * Copyright (c) 2014-2017, The University of Memphis,
Vince Lehmanc2e51f62015-01-20 15:03:11 -06004 * Regents of the University of California,
5 * Arizona Board of Regents.
akmhoque3d06e792014-05-27 16:23:20 -05006 *
7 * This file is part of NLSR (Named-data Link State Routing).
8 * See AUTHORS.md for complete list of NLSR authors and contributors.
9 *
10 * NLSR is free software: you can redistribute it and/or modify it under the terms
11 * of the GNU General Public License as published by the Free Software Foundation,
12 * either version 3 of the License, or (at your option) any later version.
13 *
14 * NLSR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
15 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
16 * PURPOSE. See the GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License along with
19 * NLSR, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
akmhoque3d06e792014-05-27 16:23:20 -050020 **/
Vince Lehmanc2e51f62015-01-20 15:03:11 -060021
dmcoomes9f936662017-03-02 10:33:09 -060022#ifndef NLSR_NLSR_HPP
23#define NLSR_NLSR_HPP
akmhoque298385a2014-02-13 14:13:09 -060024
Vince Lehmanc2acdcb2015-04-29 11:14:35 -050025#include "adjacency-list.hpp"
Vince Lehman0a7da612014-10-29 14:39:29 -050026#include "common.hpp"
akmhoque53353462014-04-22 08:43:45 -050027#include "conf-parameter.hpp"
akmhoque31d1d4b2014-05-05 22:08:14 -050028#include "hello-protocol.hpp"
Vince Lehmanc2acdcb2015-04-29 11:14:35 -050029#include "lsdb.hpp"
30#include "name-prefix-list.hpp"
Vince Lehman7b616582014-10-17 16:25:39 -050031#include "test-access-control.hpp"
Yingdi Yu20e3a6e2014-05-26 23:16:10 -070032#include "validator.hpp"
Vince Lehmanc2acdcb2015-04-29 11:14:35 -050033#include "publisher/lsdb-dataset-interest-handler.hpp"
34#include "route/fib.hpp"
35#include "route/name-prefix-table.hpp"
36#include "route/routing-table.hpp"
37#include "security/certificate-store.hpp"
38#include "update/prefix-update-processor.hpp"
Nick Gordon4d2c6c02017-01-20 13:18:46 -060039#include "update/nfd-rib-command-processor.hpp"
Vince Lehmanc2acdcb2015-04-29 11:14:35 -050040#include "utility/name-helper.hpp"
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -060041#include "stats-collector.hpp"
Yingdi Yu20e3a6e2014-05-26 23:16:10 -070042
Laqin Fan54a43f02017-03-08 12:31:30 -060043#include <stdexcept>
44
45#include <ndn-cxx/face.hpp>
46#include <ndn-cxx/security/key-chain.hpp>
47#include <ndn-cxx/security/certificate-cache-ttl.hpp>
48#include <ndn-cxx/util/scheduler.hpp>
49#include <ndn-cxx/mgmt/nfd/face-event-notification.hpp>
50#include <ndn-cxx/mgmt/nfd/face-monitor.hpp>
51#include <ndn-cxx/mgmt/dispatcher.hpp>
52#include <ndn-cxx/mgmt/nfd/face-status.hpp>
53#include <ndn-cxx/data.hpp>
54#include <ndn-cxx/encoding/block.hpp>
55
56#include <boost/cstdint.hpp>
57#include <boost/throw_exception.hpp>
58
akmhoque53353462014-04-22 08:43:45 -050059namespace nlsr {
60
Yingdi Yu20e3a6e2014-05-26 23:16:10 -070061static ndn::Name DEFAULT_BROADCAST_PREFIX("/ndn/broadcast");
62
akmhoque53353462014-04-22 08:43:45 -050063class Nlsr
64{
Nick Gordond5c1a372016-10-31 13:56:23 -050065public:
66 using FetchDatasetCallback = std::function<void(const std::vector<ndn::nfd::FaceStatus>&)>;
67 using FetchDatasetTimeoutCallback = std::function<void(uint32_t, const std::string&)>;
Nick Gordon9461afb2017-04-25 15:54:50 -050068
akmhoquefdbddb12014-05-02 18:35:19 -050069 class Error : public std::runtime_error
70 {
71 public:
72 explicit
73 Error(const std::string& what)
74 : std::runtime_error(what)
75 {
76 }
77 };
78
Laqin Fana4cf4022017-01-03 18:57:35 +000079 Nlsr(boost::asio::io_service& ioService, ndn::Scheduler& scheduler, ndn::Face& face, ndn::KeyChain& keyChain);
akmhoque298385a2014-02-13 14:13:09 -060080
akmhoque53353462014-04-22 08:43:45 -050081 void
82 registrationFailed(const ndn::Name& name);
83
84 void
akmhoque157b0a42014-05-13 00:26:37 -050085 onRegistrationSuccess(const ndn::Name& name);
86
87 void
alvy297f4162015-03-03 17:15:33 -060088 onLocalhostRegistrationSuccess(const ndn::Name& name);
89
90 void
akmhoque31d1d4b2014-05-05 22:08:14 -050091 setInfoInterestFilter();
92
93 void
94 setLsaInterestFilter();
akmhoque53353462014-04-22 08:43:45 -050095
96 void
97 startEventLoop();
98
akmhoque53353462014-04-22 08:43:45 -050099 std::string
akmhoquefdbddb12014-05-02 18:35:19 -0500100 getConfFileName() const
Yingdi Yu40cd1c32014-04-17 15:02:17 -0700101 {
akmhoque53353462014-04-22 08:43:45 -0500102 return m_configFileName;
Yingdi Yu40cd1c32014-04-17 15:02:17 -0700103 }
104
akmhoque53353462014-04-22 08:43:45 -0500105 void
akmhoquefdbddb12014-05-02 18:35:19 -0500106 setConfFileName(const std::string& fileName)
akmhoque5a44dd42014-03-12 18:11:32 -0500107 {
akmhoque53353462014-04-22 08:43:45 -0500108 m_configFileName = fileName;
109 }
akmhoque5a44dd42014-03-12 18:11:32 -0500110
akmhoque53353462014-04-22 08:43:45 -0500111 bool
112 getIsSetDaemonProcess()
113 {
114 return m_isDaemonProcess;
115 }
akmhoque5a44dd42014-03-12 18:11:32 -0500116
akmhoque53353462014-04-22 08:43:45 -0500117 void
118 setIsDaemonProcess(bool value)
119 {
120 m_isDaemonProcess = value;
121 }
akmhoque5a44dd42014-03-12 18:11:32 -0500122
akmhoque53353462014-04-22 08:43:45 -0500123 ConfParameter&
124 getConfParameter()
125 {
126 return m_confParam;
127 }
akmhoque5a44dd42014-03-12 18:11:32 -0500128
akmhoquec8a10f72014-04-25 18:42:55 -0500129 AdjacencyList&
130 getAdjacencyList()
akmhoque53353462014-04-22 08:43:45 -0500131 {
akmhoquec8a10f72014-04-25 18:42:55 -0500132 return m_adjacencyList;
akmhoque53353462014-04-22 08:43:45 -0500133 }
akmhoque298385a2014-02-13 14:13:09 -0600134
akmhoquec8a10f72014-04-25 18:42:55 -0500135 NamePrefixList&
136 getNamePrefixList()
akmhoque53353462014-04-22 08:43:45 -0500137 {
akmhoquec8a10f72014-04-25 18:42:55 -0500138 return m_namePrefixList;
akmhoque53353462014-04-22 08:43:45 -0500139 }
akmhoque298385a2014-02-13 14:13:09 -0600140
akmhoquefdbddb12014-05-02 18:35:19 -0500141 ndn::Face&
akmhoque53353462014-04-22 08:43:45 -0500142 getNlsrFace()
143 {
144 return m_nlsrFace;
145 }
akmhoque298385a2014-02-13 14:13:09 -0600146
akmhoque53353462014-04-22 08:43:45 -0500147 Lsdb&
148 getLsdb()
149 {
150 return m_nlsrLsdb;
151 }
akmhoque298385a2014-02-13 14:13:09 -0600152
akmhoque53353462014-04-22 08:43:45 -0500153 RoutingTable&
154 getRoutingTable()
155 {
156 return m_routingTable;
157 }
akmhoque298385a2014-02-13 14:13:09 -0600158
akmhoquec8a10f72014-04-25 18:42:55 -0500159 NamePrefixTable&
160 getNamePrefixTable()
akmhoque53353462014-04-22 08:43:45 -0500161 {
akmhoquec8a10f72014-04-25 18:42:55 -0500162 return m_namePrefixTable;
akmhoque53353462014-04-22 08:43:45 -0500163 }
akmhoque298385a2014-02-13 14:13:09 -0600164
akmhoque53353462014-04-22 08:43:45 -0500165 Fib&
166 getFib()
167 {
168 return m_fib;
169 }
akmhoque298385a2014-02-13 14:13:09 -0600170
akmhoque53353462014-04-22 08:43:45 -0500171 long int
172 getAdjBuildCount()
173 {
174 return m_adjBuildCount;
175 }
akmhoque298385a2014-02-13 14:13:09 -0600176
akmhoque53353462014-04-22 08:43:45 -0500177 void
178 incrementAdjBuildCount()
179 {
180 m_adjBuildCount++;
181 }
akmhoque298385a2014-02-13 14:13:09 -0600182
akmhoque53353462014-04-22 08:43:45 -0500183 void
akmhoquefdbddb12014-05-02 18:35:19 -0500184 setAdjBuildCount(int64_t abc)
akmhoque53353462014-04-22 08:43:45 -0500185 {
186 m_adjBuildCount = abc;
187 }
akmhoque298385a2014-02-13 14:13:09 -0600188
akmhoque157b0a42014-05-13 00:26:37 -0500189 bool
akmhoque53353462014-04-22 08:43:45 -0500190 getIsBuildAdjLsaSheduled()
191 {
192 return m_isBuildAdjLsaSheduled;
193 }
akmhoque298385a2014-02-13 14:13:09 -0600194
akmhoque53353462014-04-22 08:43:45 -0500195 void
196 setIsBuildAdjLsaSheduled(bool iabls)
197 {
198 m_isBuildAdjLsaSheduled = iabls;
199 }
akmhoque298385a2014-02-13 14:13:09 -0600200
akmhoque53353462014-04-22 08:43:45 -0500201 bool
202 getIsRoutingTableCalculating()
203 {
204 return m_isRoutingTableCalculating;
205 }
akmhoque85d88332014-02-17 21:11:21 -0600206
akmhoque53353462014-04-22 08:43:45 -0500207 void
208 setIsRoutingTableCalculating(bool irtc)
209 {
210 m_isRoutingTableCalculating = irtc;
211 }
akmhoque298385a2014-02-13 14:13:09 -0600212
akmhoque53353462014-04-22 08:43:45 -0500213 bool
214 getIsRouteCalculationScheduled()
215 {
216 return m_isRouteCalculationScheduled;
217 }
akmhoque298385a2014-02-13 14:13:09 -0600218
akmhoque53353462014-04-22 08:43:45 -0500219 void
220 setIsRouteCalculationScheduled(bool ircs)
221 {
222 m_isRouteCalculationScheduled = ircs;
223 }
akmhoque298385a2014-02-13 14:13:09 -0600224
Muktadir R Chowdhury3ac07282016-06-17 16:30:29 -0500225 LsdbDatasetInterestHandler&
226 getLsdbDatasetHandler()
227 {
228 return m_lsdbDatasetHandler;
229 }
230
akmhoque53353462014-04-22 08:43:45 -0500231 void
232 initialize();
akmhoque1fd8c1e2014-02-19 19:41:49 -0600233
Nick Gordond5c1a372016-10-31 13:56:23 -0500234 /*! \brief Initializes neighbors' Faces using information from NFD.
235 * \sa Nlsr::initialize()
236 * \sa Nlsr::processFaceDataset()
237 *
238 * This function serves as the entry-point for initializing the
239 * neighbors listed in nlsr.conf during Nlsr::initialize(). NLSR
240 * will attempt to fetch a dataset of Faces from NFD, and configure
241 * each of its neighbors using information from that dataset. The
242 * explicit callbacks allow for better testability.
243 */
244 void
245 initializeFaces(const FetchDatasetCallback& onFetchSuccess,
246 const FetchDatasetTimeoutCallback& onFetchFailure);
247
248 void
249 onFaceDatasetFetchTimeout(uint32_t code,
250 const std::string& reason,
251 uint32_t nRetriesSoFar);
252
253 /*! \brief Consumes a Face StatusDataset to configure NLSR neighbors.
254 * \sa Nlsr::initializeFaces
255 * \param faces A Face Dataset that should conform to FaceMgmt specifications.
256 *
257 * This function processes a Face StatusDataset that should conform
258 * to the FaceMgmt specifications listed
259 * [here](https://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Face-Dataset).
260 * Any newly configured neighbors will have prefixes registered with NFD
261 * and be sent Hello Interests as well.
262 */
263 void
264 processFaceDataset(const std::vector<ndn::nfd::FaceStatus>& faces);
265
266 /*! \brief Registers NLSR-specific prefixes for a neighbor (Adjacent)
267 * \sa Nlsr::initializeFaces
268 * \param adj A reference to the neighbor to register prefixes for
269 * \param timeout The amount of time to give NFD to respond to *each* registration request.
270 *
271 * Registers the prefixes in NFD that NLSR needs to route with a
272 * neighbor. The timeout given is how long to set the timeout for
273 * *each* registration request that is made.
274 */
275 void
276 registerAdjacencyPrefixes(const Adjacent& adj,
277 const ndn::time::milliseconds& timeout);
278
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700279 void
akmhoque443ad812014-07-29 10:26:56 -0500280 initializeKey();
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700281
282 void
283 loadValidator(boost::property_tree::ptree section,
284 const std::string& filename)
285 {
286 m_validator.load(section, filename);
287 }
288
289 Validator&
290 getValidator()
291 {
292 return m_validator;
293 }
294
295 void
dmcoomes9f936662017-03-02 10:33:09 -0600296 loadCertToPublish(std::shared_ptr<ndn::IdentityCertificate> certificate)
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700297 {
Vince Lehmanc2acdcb2015-04-29 11:14:35 -0500298 m_certStore.insert(certificate);
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700299 }
300
dmcoomes9f936662017-03-02 10:33:09 -0600301 std::shared_ptr<const ndn::IdentityCertificate>
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700302 getCertificate(const ndn::Name& certificateNameWithoutVersion)
303 {
Vince Lehmanc2acdcb2015-04-29 11:14:35 -0500304 shared_ptr<const ndn::IdentityCertificate> cert =
305 m_certStore.find(certificateNameWithoutVersion);
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700306
Vince Lehmanc2acdcb2015-04-29 11:14:35 -0500307 if (cert != nullptr) {
308 return cert;
309 }
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700310
311 return m_certificateCache->getCertificate(certificateNameWithoutVersion);
312 }
313
314 ndn::KeyChain&
315 getKeyChain()
316 {
317 return m_keyChain;
318 }
319
320 const ndn::Name&
321 getDefaultCertName()
322 {
323 return m_defaultCertName;
324 }
325
alvy297f4162015-03-03 17:15:33 -0600326 update::PrefixUpdateProcessor&
327 getPrefixUpdateProcessor()
328 {
329 return m_prefixUpdateProcessor;
330 }
331
Nick Gordon4d2c6c02017-01-20 13:18:46 -0600332 update::NfdRibCommandProcessor&
333 getNfdRibCommandProcessor()
334 {
335 return m_nfdRibCommandProcessor;
336 }
337
Nick Gordond1f4f332017-01-20 13:40:57 -0600338 ndn::mgmt::Dispatcher&
Laqin Fan54a43f02017-03-08 12:31:30 -0600339 getLocalhostDispatcher()
Nick Gordond1f4f332017-01-20 13:40:57 -0600340 {
laqinfand22da512017-05-25 17:29:53 -0500341 return m_localhostDispatcher;
342 }
343
344 ndn::mgmt::Dispatcher&
Laqin Fan54a43f02017-03-08 12:31:30 -0600345 getRouterNameDispatcher()
laqinfand22da512017-05-25 17:29:53 -0500346 {
347 return m_routerNameDispatcher;
Nick Gordond1f4f332017-01-20 13:40:57 -0600348 }
349
akmhoquee1765152014-06-30 11:32:01 -0500350 void
akmhoquec04e7272014-07-02 11:00:14 -0500351 setStrategies();
akmhoque157b0a42014-05-13 00:26:37 -0500352
akmhoque0494c252014-07-23 23:46:44 -0500353 void
354 daemonize();
355
Vince Lehman7b616582014-10-17 16:25:39 -0500356 uint32_t
357 getFirstHelloInterval() const
358 {
359 return m_firstHelloInterval;
360 }
361
Nick Gordond5c1a372016-10-31 13:56:23 -0500362 /*! \brief Canonize the URI for this and all proceeding neighbors in a list.
Nick Gordon9461afb2017-04-25 15:54:50 -0500363 *
364 * This function canonizes the URI of the Adjacent object pointed to
365 * by currentNeighbor. It then executes the then callback, providing
366 * the next iterator in the list to the callback. A standard
367 * invocation would be to pass the begin() iterator of NLSR's
368 * adjacency list, and to provide Nlsr::canonizeContinuation as the
369 * callback. Because every URI must be canonical before we begin
370 * operations, the canonize function must call initialize itself.
371 *
372 * \sa Nlsr::canonizeContinuation
373 * \sa Nlsr::initialize
374 * \sa NlsrRunner::run
375 */
376 void
377 canonizeNeighborUris(std::list<Adjacent>::iterator currentNeighbor,
378 std::function<void(std::list<Adjacent>::iterator)> then);
379
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -0600380 StatsCollector&
381 getStatsCollector()
382 {
383 return m_statsCollector;
384 }
Nick Gordon9461afb2017-04-25 15:54:50 -0500385
alvy297f4162015-03-03 17:15:33 -0600386PUBLIC_WITH_TESTS_ELSE_PRIVATE:
387 void
dmcoomes9f936662017-03-02 10:33:09 -0600388 addCertificateToCache(std::shared_ptr<ndn::IdentityCertificate> certificate)
alvy297f4162015-03-03 17:15:33 -0600389 {
390 if (certificate != nullptr) {
391 m_certificateCache->insertCertificate(certificate);
392 }
393 }
394
Vince Lehmanc2acdcb2015-04-29 11:14:35 -0500395 security::CertificateStore&
396 getCertificateStore()
397 {
398 return m_certStore;
399 }
400
akmhoque393d4ff2014-07-16 14:27:03 -0500401private:
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700402 void
403 registerKeyPrefix();
404
405 void
alvy297f4162015-03-03 17:15:33 -0600406 registerLocalhostPrefix();
407
408 void
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700409 onKeyInterest(const ndn::Name& name, const ndn::Interest& interest);
410
411 void
412 onKeyPrefixRegSuccess(const ndn::Name& name);
413
akmhoquee1765152014-06-30 11:32:01 -0500414 void
akmhoquec04e7272014-07-02 11:00:14 -0500415 onFaceEventNotification(const ndn::nfd::FaceEventNotification& faceEventNotification);
akmhoquee1765152014-06-30 11:32:01 -0500416
Vince Lehman7b616582014-10-17 16:25:39 -0500417 void
418 setFirstHelloInterval(uint32_t interval)
419 {
420 m_firstHelloInterval = interval;
421 }
422
Nick Gordond5c1a372016-10-31 13:56:23 -0500423 /*! \brief Continues canonizing neighbor URIs.
Nick Gordon9461afb2017-04-25 15:54:50 -0500424 *
425 * For testability reasons, we want what each instance of
426 * canonization does after completion to be controllable. The best
427 * way to do this is to control that by simply passing a
428 * continuation function.
429 */
430 void
431 canonizeContinuation(std::list<Adjacent>::iterator iterator);
432
Nick Gordond5c1a372016-10-31 13:56:23 -0500433 void
434 scheduleDatasetFetch();
435
alvy297f4162015-03-03 17:15:33 -0600436public:
437 static const ndn::Name LOCALHOST_PREFIX;
438
akmhoque157b0a42014-05-13 00:26:37 -0500439private:
Vince Lehman904c2412014-09-23 19:36:11 -0500440 ndn::Face& m_nlsrFace;
Vince Lehman7c603292014-09-11 17:48:16 -0500441 ndn::Scheduler& m_scheduler;
Laqin Fana4cf4022017-01-03 18:57:35 +0000442 ndn::KeyChain& m_keyChain;
akmhoque53353462014-04-22 08:43:45 -0500443 ConfParameter m_confParam;
akmhoquec8a10f72014-04-25 18:42:55 -0500444 AdjacencyList m_adjacencyList;
445 NamePrefixList m_namePrefixList;
akmhoque53353462014-04-22 08:43:45 -0500446 bool m_isDaemonProcess;
akmhoquefdbddb12014-05-02 18:35:19 -0500447 std::string m_configFileName;
akmhoque53353462014-04-22 08:43:45 -0500448 Lsdb m_nlsrLsdb;
akmhoquefdbddb12014-05-02 18:35:19 -0500449 int64_t m_adjBuildCount;
akmhoque53353462014-04-22 08:43:45 -0500450 bool m_isBuildAdjLsaSheduled;
451 bool m_isRouteCalculationScheduled;
452 bool m_isRoutingTableCalculating;
akmhoque53353462014-04-22 08:43:45 -0500453 RoutingTable m_routingTable;
akmhoque53353462014-04-22 08:43:45 -0500454 Fib m_fib;
akmhoque31d1d4b2014-05-05 22:08:14 -0500455 NamePrefixTable m_namePrefixTable;
Laqin Fan54a43f02017-03-08 12:31:30 -0600456
laqinfand22da512017-05-25 17:29:53 -0500457 ndn::mgmt::Dispatcher m_localhostDispatcher;
458 ndn::mgmt::Dispatcher m_routerNameDispatcher;
459
Vince Lehmand6bb3fa2015-04-24 14:21:39 -0500460 LsdbDatasetInterestHandler m_lsdbDatasetHandler;
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700461
Vince Lehmanf7eec4f2015-05-08 19:02:31 -0500462PUBLIC_WITH_TESTS_ELSE_PRIVATE:
463 HelloProtocol m_helloProtocol;
464
Vince Lehman7b616582014-10-17 16:25:39 -0500465private:
dmcoomes9f936662017-03-02 10:33:09 -0600466 std::shared_ptr<ndn::CertificateCacheTtl> m_certificateCache;
Vince Lehmanc2acdcb2015-04-29 11:14:35 -0500467 security::CertificateStore m_certStore;
Nick Gordond5c1a372016-10-31 13:56:23 -0500468
469PUBLIC_WITH_TESTS_ELSE_PRIVATE:
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700470 Validator m_validator;
Nick Gordond5c1a372016-10-31 13:56:23 -0500471
472private:
473 ndn::nfd::Controller m_controller;
474 ndn::nfd::Controller m_faceDatasetController;
Joao Pereira97473d42015-07-03 16:57:27 -0400475 ndn::security::SigningInfo m_signingInfo;
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700476 ndn::Name m_defaultCertName;
alvy297f4162015-03-03 17:15:33 -0600477 update::PrefixUpdateProcessor m_prefixUpdateProcessor;
Nick Gordon4d2c6c02017-01-20 13:18:46 -0600478 update::NfdRibCommandProcessor m_nfdRibCommandProcessor;
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -0600479 StatsCollector m_statsCollector;
akmhoquee1765152014-06-30 11:32:01 -0500480
akmhoque060d3022014-08-12 13:35:06 -0500481 ndn::nfd::FaceMonitor m_faceMonitor;
Vince Lehman7b616582014-10-17 16:25:39 -0500482
483 uint32_t m_firstHelloInterval;
Nick Gordond5c1a372016-10-31 13:56:23 -0500484
485 friend class NlsrRunner;
akmhoque53353462014-04-22 08:43:45 -0500486};
akmhoque298385a2014-02-13 14:13:09 -0600487
Nick Gordonfad8e252016-08-11 14:21:38 -0500488} // namespace nlsr
akmhoqueb1710aa2014-02-19 17:13:36 -0600489
dmcoomes9f936662017-03-02 10:33:09 -0600490#endif // NLSR_NLSR_HPP