blob: 476650f1c4a98b15465a076cce764ee5a187cad3 [file] [log] [blame]
akmhoque3d06e792014-05-27 16:23:20 -05001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
laqinfan35731852017-08-08 06:17:39 -05003 * Copyright (c) 2014-2018, 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"
laqinfan35731852017-08-08 06:17:39 -050032#include "publisher/dataset-interest-handler.hpp"
Vince Lehmanc2acdcb2015-04-29 11:14:35 -050033#include "route/fib.hpp"
34#include "route/name-prefix-table.hpp"
35#include "route/routing-table.hpp"
36#include "security/certificate-store.hpp"
37#include "update/prefix-update-processor.hpp"
Nick Gordon4d2c6c02017-01-20 13:18:46 -060038#include "update/nfd-rib-command-processor.hpp"
Vince Lehmanc2acdcb2015-04-29 11:14:35 -050039#include "utility/name-helper.hpp"
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -060040#include "stats-collector.hpp"
Yingdi Yu20e3a6e2014-05-26 23:16:10 -070041
Nick Gordond0a7df32017-05-30 16:44:34 -050042#include <boost/cstdint.hpp>
Laqin Fan54a43f02017-03-08 12:31:30 -060043#include <stdexcept>
Nick Gordond0a7df32017-05-30 16:44:34 -050044#include <boost/throw_exception.hpp>
Laqin Fan54a43f02017-03-08 12:31:30 -060045
46#include <ndn-cxx/face.hpp>
47#include <ndn-cxx/security/key-chain.hpp>
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -050048#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>
Laqin Fan54a43f02017-03-08 12:31:30 -060052#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>
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -050059#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>
Laqin Fan54a43f02017-03-08 12:31:30 -060062
akmhoque53353462014-04-22 08:43:45 -050063namespace nlsr {
64
Yingdi Yu20e3a6e2014-05-26 23:16:10 -070065static ndn::Name DEFAULT_BROADCAST_PREFIX("/ndn/broadcast");
66
akmhoque53353462014-04-22 08:43:45 -050067class Nlsr
68{
Nick Gordond5c1a372016-10-31 13:56:23 -050069public:
70 using FetchDatasetCallback = std::function<void(const std::vector<ndn::nfd::FaceStatus>&)>;
71 using FetchDatasetTimeoutCallback = std::function<void(uint32_t, const std::string&)>;
Nick Gordon9461afb2017-04-25 15:54:50 -050072
akmhoquefdbddb12014-05-02 18:35:19 -050073 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
Laqin Fana4cf4022017-01-03 18:57:35 +000083 Nlsr(boost::asio::io_service& ioService, ndn::Scheduler& scheduler, ndn::Face& face, ndn::KeyChain& keyChain);
akmhoque298385a2014-02-13 14:13:09 -060084
akmhoque53353462014-04-22 08:43:45 -050085 void
86 registrationFailed(const ndn::Name& name);
87
88 void
akmhoque157b0a42014-05-13 00:26:37 -050089 onRegistrationSuccess(const ndn::Name& name);
90
91 void
akmhoque31d1d4b2014-05-05 22:08:14 -050092 setInfoInterestFilter();
93
94 void
95 setLsaInterestFilter();
akmhoque53353462014-04-22 08:43:45 -050096
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -050097 /*! \brief Add top level prefixes for Dispatcher
98 *
99 * All dispatcher-related sub-prefixes *must* be registered before sub-prefixes
100 * must be added before adding top
101 */
102 void
103 addDispatcherTopPrefix(const ndn::Name& topPrefix);
104
akmhoque53353462014-04-22 08:43:45 -0500105 void
106 startEventLoop();
107
akmhoque53353462014-04-22 08:43:45 -0500108 std::string
akmhoquefdbddb12014-05-02 18:35:19 -0500109 getConfFileName() const
Yingdi Yu40cd1c32014-04-17 15:02:17 -0700110 {
akmhoque53353462014-04-22 08:43:45 -0500111 return m_configFileName;
Yingdi Yu40cd1c32014-04-17 15:02:17 -0700112 }
113
akmhoque53353462014-04-22 08:43:45 -0500114 void
akmhoquefdbddb12014-05-02 18:35:19 -0500115 setConfFileName(const std::string& fileName)
akmhoque5a44dd42014-03-12 18:11:32 -0500116 {
akmhoque53353462014-04-22 08:43:45 -0500117 m_configFileName = fileName;
118 }
akmhoque5a44dd42014-03-12 18:11:32 -0500119
akmhoque53353462014-04-22 08:43:45 -0500120 ConfParameter&
121 getConfParameter()
122 {
123 return m_confParam;
124 }
akmhoque5a44dd42014-03-12 18:11:32 -0500125
Nick Gordon49648702018-01-22 11:57:33 -0600126 const ConfParameter&
127 getConfParameter() const
128 {
129 return m_confParam;
130 }
131
akmhoquec8a10f72014-04-25 18:42:55 -0500132 AdjacencyList&
133 getAdjacencyList()
akmhoque53353462014-04-22 08:43:45 -0500134 {
akmhoquec8a10f72014-04-25 18:42:55 -0500135 return m_adjacencyList;
akmhoque53353462014-04-22 08:43:45 -0500136 }
akmhoque298385a2014-02-13 14:13:09 -0600137
Nick Gordon49648702018-01-22 11:57:33 -0600138 const AdjacencyList&
139 getAdjacencyList() const
140 {
141 return m_adjacencyList;
142 }
143
akmhoquec8a10f72014-04-25 18:42:55 -0500144 NamePrefixList&
145 getNamePrefixList()
akmhoque53353462014-04-22 08:43:45 -0500146 {
akmhoquec8a10f72014-04-25 18:42:55 -0500147 return m_namePrefixList;
akmhoque53353462014-04-22 08:43:45 -0500148 }
akmhoque298385a2014-02-13 14:13:09 -0600149
Nick Gordon49648702018-01-22 11:57:33 -0600150 const NamePrefixList&
151 getNamePrefixList() const
152 {
153 return m_namePrefixList;
154 }
155
akmhoquefdbddb12014-05-02 18:35:19 -0500156 ndn::Face&
akmhoque53353462014-04-22 08:43:45 -0500157 getNlsrFace()
158 {
159 return m_nlsrFace;
160 }
akmhoque298385a2014-02-13 14:13:09 -0600161
akmhoque53353462014-04-22 08:43:45 -0500162 Lsdb&
163 getLsdb()
164 {
165 return m_nlsrLsdb;
166 }
akmhoque298385a2014-02-13 14:13:09 -0600167
akmhoque53353462014-04-22 08:43:45 -0500168 RoutingTable&
169 getRoutingTable()
170 {
171 return m_routingTable;
172 }
akmhoque298385a2014-02-13 14:13:09 -0600173
akmhoquec8a10f72014-04-25 18:42:55 -0500174 NamePrefixTable&
175 getNamePrefixTable()
akmhoque53353462014-04-22 08:43:45 -0500176 {
akmhoquec8a10f72014-04-25 18:42:55 -0500177 return m_namePrefixTable;
akmhoque53353462014-04-22 08:43:45 -0500178 }
akmhoque298385a2014-02-13 14:13:09 -0600179
akmhoque53353462014-04-22 08:43:45 -0500180 Fib&
181 getFib()
182 {
183 return m_fib;
184 }
akmhoque298385a2014-02-13 14:13:09 -0600185
akmhoque53353462014-04-22 08:43:45 -0500186 long int
187 getAdjBuildCount()
188 {
189 return m_adjBuildCount;
190 }
akmhoque298385a2014-02-13 14:13:09 -0600191
akmhoque53353462014-04-22 08:43:45 -0500192 void
193 incrementAdjBuildCount()
194 {
195 m_adjBuildCount++;
196 }
akmhoque298385a2014-02-13 14:13:09 -0600197
akmhoque53353462014-04-22 08:43:45 -0500198 void
akmhoquefdbddb12014-05-02 18:35:19 -0500199 setAdjBuildCount(int64_t abc)
akmhoque53353462014-04-22 08:43:45 -0500200 {
201 m_adjBuildCount = abc;
202 }
akmhoque298385a2014-02-13 14:13:09 -0600203
akmhoque157b0a42014-05-13 00:26:37 -0500204 bool
akmhoque53353462014-04-22 08:43:45 -0500205 getIsBuildAdjLsaSheduled()
206 {
207 return m_isBuildAdjLsaSheduled;
208 }
akmhoque298385a2014-02-13 14:13:09 -0600209
akmhoque53353462014-04-22 08:43:45 -0500210 void
211 setIsBuildAdjLsaSheduled(bool iabls)
212 {
213 m_isBuildAdjLsaSheduled = iabls;
214 }
akmhoque298385a2014-02-13 14:13:09 -0600215
akmhoque53353462014-04-22 08:43:45 -0500216 bool
217 getIsRoutingTableCalculating()
218 {
219 return m_isRoutingTableCalculating;
220 }
akmhoque85d88332014-02-17 21:11:21 -0600221
akmhoque53353462014-04-22 08:43:45 -0500222 void
223 setIsRoutingTableCalculating(bool irtc)
224 {
225 m_isRoutingTableCalculating = irtc;
226 }
akmhoque298385a2014-02-13 14:13:09 -0600227
akmhoque53353462014-04-22 08:43:45 -0500228 bool
229 getIsRouteCalculationScheduled()
230 {
231 return m_isRouteCalculationScheduled;
232 }
akmhoque298385a2014-02-13 14:13:09 -0600233
akmhoque53353462014-04-22 08:43:45 -0500234 void
235 setIsRouteCalculationScheduled(bool ircs)
236 {
237 m_isRouteCalculationScheduled = ircs;
238 }
akmhoque298385a2014-02-13 14:13:09 -0600239
laqinfan35731852017-08-08 06:17:39 -0500240 DatasetInterestHandler&
241 getDatasetHandler()
Muktadir R Chowdhury3ac07282016-06-17 16:30:29 -0500242 {
laqinfan35731852017-08-08 06:17:39 -0500243 return m_datasetHandler;
Muktadir R Chowdhury3ac07282016-06-17 16:30:29 -0500244 }
245
akmhoque53353462014-04-22 08:43:45 -0500246 void
247 initialize();
akmhoque1fd8c1e2014-02-19 19:41:49 -0600248
Nick Gordond5c1a372016-10-31 13:56:23 -0500249 /*! \brief Initializes neighbors' Faces using information from NFD.
250 * \sa Nlsr::initialize()
251 * \sa Nlsr::processFaceDataset()
252 *
253 * This function serves as the entry-point for initializing the
254 * neighbors listed in nlsr.conf during Nlsr::initialize(). NLSR
255 * will attempt to fetch a dataset of Faces from NFD, and configure
256 * each of its neighbors using information from that dataset. The
257 * explicit callbacks allow for better testability.
258 */
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
268 /*! \brief Consumes a Face StatusDataset to configure NLSR neighbors.
269 * \sa Nlsr::initializeFaces
270 * \param faces A Face Dataset that should conform to FaceMgmt specifications.
271 *
272 * This function processes a Face StatusDataset that should conform
273 * to the FaceMgmt specifications listed
274 * [here](https://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Face-Dataset).
275 * Any newly configured neighbors will have prefixes registered with NFD
276 * and be sent Hello Interests as well.
277 */
278 void
279 processFaceDataset(const std::vector<ndn::nfd::FaceStatus>& faces);
280
281 /*! \brief Registers NLSR-specific prefixes for a neighbor (Adjacent)
282 * \sa Nlsr::initializeFaces
283 * \param adj A reference to the neighbor to register prefixes for
284 * \param timeout The amount of time to give NFD to respond to *each* registration request.
285 *
286 * Registers the prefixes in NFD that NLSR needs to route with a
287 * neighbor. The timeout given is how long to set the timeout for
288 * *each* registration request that is made.
289 */
290 void
291 registerAdjacencyPrefixes(const Adjacent& adj,
292 const ndn::time::milliseconds& timeout);
293
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500294 /*! \brief Add a certificate NLSR claims to be authoritative for to the certificate store.
295 *
296 * \sa CertificateStore
297 */
298 void
299 loadCertToPublish(const ndn::security::v2::Certificate& certificate);
300
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700301 void
Muktadir Chowdhuryc3ea26f2018-01-05 21:40:59 +0000302 connectToFetcher(ndn::util::SegmentFetcher& fetcher);
303
304 /*! \brief Callback when SegmentFetcher retrieves a segment.
305 */
306 void
307 afterFetcherSignalEmitted(const ndn::Data& lsaSegment);
308
309 /*! \brief Retrieves the chain of certificates from Validator's cache and
310 * store them in Nlsr's own CertificateStore.
311 * \param keyName Name of the first key in the certificate chain.
312 */
313 void
314 publishCertFromCache(const ndn::Name& keyName);
315
316 void
akmhoque443ad812014-07-29 10:26:56 -0500317 initializeKey();
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700318
319 void
320 loadValidator(boost::property_tree::ptree section,
321 const std::string& filename)
322 {
323 m_validator.load(section, filename);
324 }
325
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500326 ndn::security::ValidatorConfig&
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700327 getValidator()
328 {
329 return m_validator;
330 }
331
Nick Gordond0a7df32017-05-30 16:44:34 -0500332 /*! \brief Find a certificate
333 *
334 * Find a certificate that NLSR has. First it checks against the
335 * certificates this NLSR claims to be authoritative for, usually
336 * something like this specific router's certificate, and then
337 * checks the cache of certficates it has already fetched. If none
338 * can be found, it will return an empty pointer.
339 */
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500340 const ndn::security::v2::Certificate*
341 getCertificate(const ndn::Name& certificateKeyName)
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700342 {
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500343 const ndn::security::v2::Certificate* cert =
344 m_certStore.find(certificateKeyName);
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700345
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500346 return cert;
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700347 }
348
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500349 ndn::security::v2::KeyChain&
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700350 getKeyChain()
351 {
352 return m_keyChain;
353 }
354
355 const ndn::Name&
356 getDefaultCertName()
357 {
358 return m_defaultCertName;
359 }
360
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500361 const ndn::security::SigningInfo&
362 getSigningInfo()
363 {
364 return m_signingInfo;
365 }
366
alvy297f4162015-03-03 17:15:33 -0600367 update::PrefixUpdateProcessor&
368 getPrefixUpdateProcessor()
369 {
370 return m_prefixUpdateProcessor;
371 }
372
Nick Gordon4d2c6c02017-01-20 13:18:46 -0600373 update::NfdRibCommandProcessor&
374 getNfdRibCommandProcessor()
375 {
376 return m_nfdRibCommandProcessor;
377 }
378
Nick Gordond1f4f332017-01-20 13:40:57 -0600379 ndn::mgmt::Dispatcher&
laqinfan35731852017-08-08 06:17:39 -0500380 getDispatcher()
Nick Gordond1f4f332017-01-20 13:40:57 -0600381 {
laqinfan35731852017-08-08 06:17:39 -0500382 return m_dispatcher;
Nick Gordond1f4f332017-01-20 13:40:57 -0600383 }
384
akmhoquee1765152014-06-30 11:32:01 -0500385 void
akmhoquec04e7272014-07-02 11:00:14 -0500386 setStrategies();
akmhoque157b0a42014-05-13 00:26:37 -0500387
Vince Lehman7b616582014-10-17 16:25:39 -0500388 uint32_t
389 getFirstHelloInterval() const
390 {
391 return m_firstHelloInterval;
392 }
393
Nick Gordond5c1a372016-10-31 13:56:23 -0500394 /*! \brief Canonize the URI for this and all proceeding neighbors in a list.
Nick Gordon9461afb2017-04-25 15:54:50 -0500395 *
396 * This function canonizes the URI of the Adjacent object pointed to
397 * by currentNeighbor. It then executes the then callback, providing
398 * the next iterator in the list to the callback. A standard
399 * invocation would be to pass the begin() iterator of NLSR's
400 * adjacency list, and to provide Nlsr::canonizeContinuation as the
401 * callback. Because every URI must be canonical before we begin
Nick Gordon922714a2017-06-13 14:12:02 -0500402 * operations, the canonize function provides a finally() function
403 * to resume whatever needs to occur.
Nick Gordon9461afb2017-04-25 15:54:50 -0500404 *
405 * \sa Nlsr::canonizeContinuation
406 * \sa Nlsr::initialize
407 * \sa NlsrRunner::run
408 */
409 void
410 canonizeNeighborUris(std::list<Adjacent>::iterator currentNeighbor,
Nick Gordon922714a2017-06-13 14:12:02 -0500411 std::function<void(std::list<Adjacent>::iterator)> then,
412 std::function<void(void)> finally);
Nick Gordon9461afb2017-04-25 15:54:50 -0500413
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -0600414 StatsCollector&
415 getStatsCollector()
416 {
417 return m_statsCollector;
418 }
Nick Gordon9461afb2017-04-25 15:54:50 -0500419
alvy297f4162015-03-03 17:15:33 -0600420PUBLIC_WITH_TESTS_ELSE_PRIVATE:
alvy297f4162015-03-03 17:15:33 -0600421
Vince Lehmanc2acdcb2015-04-29 11:14:35 -0500422 security::CertificateStore&
423 getCertificateStore()
424 {
425 return m_certStore;
426 }
427
akmhoque393d4ff2014-07-16 14:27:03 -0500428private:
Nick Gordond0a7df32017-05-30 16:44:34 -0500429 /*! \brief Registers the prefix that NLSR will use for key/certificate interests.
430 */
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700431 void
432 registerKeyPrefix();
433
Nick Gordond0a7df32017-05-30 16:44:34 -0500434 /*! \brief Registers the prefix that NLSR will consider to be the machine-local, secure prefix.
435 */
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700436 void
alvy297f4162015-03-03 17:15:33 -0600437 registerLocalhostPrefix();
438
Ashlesh Gawandecba0ae22018-03-27 17:57:56 -0500439 /*! \brief Registers the <router-prefix>/nlsr so that NLSR can respond to status requests from remote routers.
440 */
441 void
442 registerRouterPrefix();
443
Nick Gordond0a7df32017-05-30 16:44:34 -0500444 /*! \brief Attempts to satisfy an Interest for a certificate, and send it back.
445 */
alvy297f4162015-03-03 17:15:33 -0600446 void
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700447 onKeyInterest(const ndn::Name& name, const ndn::Interest& interest);
448
Nick Gordond0a7df32017-05-30 16:44:34 -0500449 /*! \brief Do nothing.
450 */
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700451 void
452 onKeyPrefixRegSuccess(const ndn::Name& name);
453
Nick Gordond0a7df32017-05-30 16:44:34 -0500454 /*! \brief Do nothing.
455 */
akmhoquee1765152014-06-30 11:32:01 -0500456 void
akmhoquec04e7272014-07-02 11:00:14 -0500457 onFaceEventNotification(const ndn::nfd::FaceEventNotification& faceEventNotification);
akmhoquee1765152014-06-30 11:32:01 -0500458
Vince Lehman7b616582014-10-17 16:25:39 -0500459 void
460 setFirstHelloInterval(uint32_t interval)
461 {
462 m_firstHelloInterval = interval;
463 }
464
Nick Gordond5c1a372016-10-31 13:56:23 -0500465 /*! \brief Continues canonizing neighbor URIs.
Nick Gordon9461afb2017-04-25 15:54:50 -0500466 *
467 * For testability reasons, we want what each instance of
468 * canonization does after completion to be controllable. The best
469 * way to do this is to control that by simply passing a
470 * continuation function.
471 */
472 void
Nick Gordon922714a2017-06-13 14:12:02 -0500473 canonizeContinuation(std::list<Adjacent>::iterator iterator,
474 std::function<void(void)> finally);
Nick Gordon9461afb2017-04-25 15:54:50 -0500475
Nick Gordond5c1a372016-10-31 13:56:23 -0500476 void
477 scheduleDatasetFetch();
478
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500479 /*! \brief Enables NextHopFaceId indication in NFD for incoming data packet.
480 *
481 * After enabling, when NFD gets a data packet, it will put the incoming face id
482 * of the data in NextHopFaceId field of the packet. The NextHopFaceId will be used
483 * by DirectFetcher to fetch the certificates needed to validate the data packet.
484 * \sa https://redmine.named-data.net/projects/nfd/wiki/NDNLPv2#Consumer-Controlled-Forwarding
485 */
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
alvy297f4162015-03-03 17:15:33 -0600495public:
496 static const ndn::Name LOCALHOST_PREFIX;
497
akmhoque157b0a42014-05-13 00:26:37 -0500498private:
Vince Lehman904c2412014-09-23 19:36:11 -0500499 ndn::Face& m_nlsrFace;
Vince Lehman7c603292014-09-11 17:48:16 -0500500 ndn::Scheduler& m_scheduler;
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500501 ndn::security::v2::KeyChain& m_keyChain;
akmhoque53353462014-04-22 08:43:45 -0500502 ConfParameter m_confParam;
akmhoquec8a10f72014-04-25 18:42:55 -0500503 AdjacencyList m_adjacencyList;
504 NamePrefixList m_namePrefixList;
akmhoquefdbddb12014-05-02 18:35:19 -0500505 std::string m_configFileName;
akmhoque53353462014-04-22 08:43:45 -0500506 Lsdb m_nlsrLsdb;
akmhoquefdbddb12014-05-02 18:35:19 -0500507 int64_t m_adjBuildCount;
akmhoque53353462014-04-22 08:43:45 -0500508 bool m_isBuildAdjLsaSheduled;
509 bool m_isRouteCalculationScheduled;
510 bool m_isRoutingTableCalculating;
akmhoque53353462014-04-22 08:43:45 -0500511 RoutingTable m_routingTable;
akmhoque53353462014-04-22 08:43:45 -0500512 Fib m_fib;
akmhoque31d1d4b2014-05-05 22:08:14 -0500513 NamePrefixTable m_namePrefixTable;
Laqin Fan54a43f02017-03-08 12:31:30 -0600514
laqinfan35731852017-08-08 06:17:39 -0500515 ndn::mgmt::Dispatcher m_dispatcher;
laqinfand22da512017-05-25 17:29:53 -0500516
laqinfan35731852017-08-08 06:17:39 -0500517 DatasetInterestHandler m_datasetHandler;
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700518
Vince Lehmanf7eec4f2015-05-08 19:02:31 -0500519PUBLIC_WITH_TESTS_ELSE_PRIVATE:
520 HelloProtocol m_helloProtocol;
521
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500522 ndn::security::ValidatorConfig m_validator;
523
Vince Lehman7b616582014-10-17 16:25:39 -0500524private:
Nick Gordond0a7df32017-05-30 16:44:34 -0500525 /*! \brief Where NLSR stores certificates it claims to be
526 * authoritative for. Usually the router certificate.
527 */
Vince Lehmanc2acdcb2015-04-29 11:14:35 -0500528 security::CertificateStore m_certStore;
Nick Gordond5c1a372016-10-31 13:56:23 -0500529
Nick Gordond5c1a372016-10-31 13:56:23 -0500530 ndn::nfd::Controller m_controller;
531 ndn::nfd::Controller m_faceDatasetController;
Joao Pereira97473d42015-07-03 16:57:27 -0400532 ndn::security::SigningInfo m_signingInfo;
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700533 ndn::Name m_defaultCertName;
alvy297f4162015-03-03 17:15:33 -0600534 update::PrefixUpdateProcessor m_prefixUpdateProcessor;
Nick Gordon4d2c6c02017-01-20 13:18:46 -0600535 update::NfdRibCommandProcessor m_nfdRibCommandProcessor;
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -0600536 StatsCollector m_statsCollector;
akmhoquee1765152014-06-30 11:32:01 -0500537
akmhoque060d3022014-08-12 13:35:06 -0500538 ndn::nfd::FaceMonitor m_faceMonitor;
Vince Lehman7b616582014-10-17 16:25:39 -0500539
540 uint32_t m_firstHelloInterval;
Nick Gordond5c1a372016-10-31 13:56:23 -0500541
542 friend class NlsrRunner;
akmhoque53353462014-04-22 08:43:45 -0500543};
akmhoque298385a2014-02-13 14:13:09 -0600544
Nick Gordonfad8e252016-08-11 14:21:38 -0500545} // namespace nlsr
akmhoqueb1710aa2014-02-19 17:13:36 -0600546
dmcoomes9f936662017-03-02 10:33:09 -0600547#endif // NLSR_NLSR_HPP