blob: 81629ae2d4d0ed3c83cc1f505c7b5c0c57b0c557 [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
akmhoquefdbddb12014-05-02 18:35:19 -050025#include <boost/cstdint.hpp>
26#include <stdexcept>
dmcoomes9f936662017-03-02 10:33:09 -060027#include <boost/throw_exception.hpp>
akmhoquefdbddb12014-05-02 18:35:19 -050028
akmhoquec8a10f72014-04-25 18:42:55 -050029#include <ndn-cxx/face.hpp>
30#include <ndn-cxx/security/key-chain.hpp>
Yingdi Yu20e3a6e2014-05-26 23:16:10 -070031#include <ndn-cxx/security/certificate-cache-ttl.hpp>
akmhoquec8a10f72014-04-25 18:42:55 -050032#include <ndn-cxx/util/scheduler.hpp>
Junxiao Shi3e5120c2016-09-10 16:58:34 +000033#include <ndn-cxx/mgmt/nfd/face-event-notification.hpp>
34#include <ndn-cxx/mgmt/nfd/face-monitor.hpp>
Nick Gordond1f4f332017-01-20 13:40:57 -060035#include <ndn-cxx/mgmt/dispatcher.hpp>
akmhoque298385a2014-02-13 14:13:09 -060036
Vince Lehmanc2acdcb2015-04-29 11:14:35 -050037#include "adjacency-list.hpp"
Vince Lehman0a7da612014-10-29 14:39:29 -050038#include "common.hpp"
akmhoque53353462014-04-22 08:43:45 -050039#include "conf-parameter.hpp"
akmhoque31d1d4b2014-05-05 22:08:14 -050040#include "hello-protocol.hpp"
Vince Lehmanc2acdcb2015-04-29 11:14:35 -050041#include "lsdb.hpp"
42#include "name-prefix-list.hpp"
Vince Lehman7b616582014-10-17 16:25:39 -050043#include "test-access-control.hpp"
Yingdi Yu20e3a6e2014-05-26 23:16:10 -070044#include "validator.hpp"
Vince Lehmanc2acdcb2015-04-29 11:14:35 -050045#include "publisher/lsdb-dataset-interest-handler.hpp"
46#include "route/fib.hpp"
47#include "route/name-prefix-table.hpp"
48#include "route/routing-table.hpp"
49#include "security/certificate-store.hpp"
50#include "update/prefix-update-processor.hpp"
Nick Gordon4d2c6c02017-01-20 13:18:46 -060051#include "update/nfd-rib-command-processor.hpp"
Vince Lehmanc2acdcb2015-04-29 11:14:35 -050052#include "utility/name-helper.hpp"
Yingdi Yu20e3a6e2014-05-26 23:16:10 -070053
akmhoque53353462014-04-22 08:43:45 -050054namespace nlsr {
55
Yingdi Yu20e3a6e2014-05-26 23:16:10 -070056static ndn::Name DEFAULT_BROADCAST_PREFIX("/ndn/broadcast");
57
akmhoque53353462014-04-22 08:43:45 -050058class Nlsr
59{
Nick Gordon9461afb2017-04-25 15:54:50 -050060 friend class NlsrRunner;
61
akmhoquefdbddb12014-05-02 18:35:19 -050062 class Error : public std::runtime_error
63 {
64 public:
65 explicit
66 Error(const std::string& what)
67 : std::runtime_error(what)
68 {
69 }
70 };
71
akmhoque53353462014-04-22 08:43:45 -050072public:
Laqin Fana4cf4022017-01-03 18:57:35 +000073 Nlsr(boost::asio::io_service& ioService, ndn::Scheduler& scheduler, ndn::Face& face, ndn::KeyChain& keyChain);
akmhoque298385a2014-02-13 14:13:09 -060074
akmhoque53353462014-04-22 08:43:45 -050075 void
76 registrationFailed(const ndn::Name& name);
77
78 void
akmhoque157b0a42014-05-13 00:26:37 -050079 onRegistrationSuccess(const ndn::Name& name);
80
81 void
alvy297f4162015-03-03 17:15:33 -060082 onLocalhostRegistrationSuccess(const ndn::Name& name);
83
84 void
akmhoque31d1d4b2014-05-05 22:08:14 -050085 setInfoInterestFilter();
86
87 void
88 setLsaInterestFilter();
akmhoque53353462014-04-22 08:43:45 -050089
90 void
91 startEventLoop();
92
akmhoque53353462014-04-22 08:43:45 -050093 std::string
akmhoquefdbddb12014-05-02 18:35:19 -050094 getConfFileName() const
Yingdi Yu40cd1c32014-04-17 15:02:17 -070095 {
akmhoque53353462014-04-22 08:43:45 -050096 return m_configFileName;
Yingdi Yu40cd1c32014-04-17 15:02:17 -070097 }
98
akmhoque53353462014-04-22 08:43:45 -050099 void
akmhoquefdbddb12014-05-02 18:35:19 -0500100 setConfFileName(const std::string& fileName)
akmhoque5a44dd42014-03-12 18:11:32 -0500101 {
akmhoque53353462014-04-22 08:43:45 -0500102 m_configFileName = fileName;
103 }
akmhoque5a44dd42014-03-12 18:11:32 -0500104
akmhoque53353462014-04-22 08:43:45 -0500105 bool
106 getIsSetDaemonProcess()
107 {
108 return m_isDaemonProcess;
109 }
akmhoque5a44dd42014-03-12 18:11:32 -0500110
akmhoque53353462014-04-22 08:43:45 -0500111 void
112 setIsDaemonProcess(bool value)
113 {
114 m_isDaemonProcess = value;
115 }
akmhoque5a44dd42014-03-12 18:11:32 -0500116
akmhoque53353462014-04-22 08:43:45 -0500117 ConfParameter&
118 getConfParameter()
119 {
120 return m_confParam;
121 }
akmhoque5a44dd42014-03-12 18:11:32 -0500122
akmhoquec8a10f72014-04-25 18:42:55 -0500123 AdjacencyList&
124 getAdjacencyList()
akmhoque53353462014-04-22 08:43:45 -0500125 {
akmhoquec8a10f72014-04-25 18:42:55 -0500126 return m_adjacencyList;
akmhoque53353462014-04-22 08:43:45 -0500127 }
akmhoque298385a2014-02-13 14:13:09 -0600128
akmhoquec8a10f72014-04-25 18:42:55 -0500129 NamePrefixList&
130 getNamePrefixList()
akmhoque53353462014-04-22 08:43:45 -0500131 {
akmhoquec8a10f72014-04-25 18:42:55 -0500132 return m_namePrefixList;
akmhoque53353462014-04-22 08:43:45 -0500133 }
akmhoque298385a2014-02-13 14:13:09 -0600134
akmhoquefdbddb12014-05-02 18:35:19 -0500135 ndn::Face&
akmhoque53353462014-04-22 08:43:45 -0500136 getNlsrFace()
137 {
138 return m_nlsrFace;
139 }
akmhoque298385a2014-02-13 14:13:09 -0600140
akmhoque53353462014-04-22 08:43:45 -0500141 Lsdb&
142 getLsdb()
143 {
144 return m_nlsrLsdb;
145 }
akmhoque298385a2014-02-13 14:13:09 -0600146
akmhoque53353462014-04-22 08:43:45 -0500147 RoutingTable&
148 getRoutingTable()
149 {
150 return m_routingTable;
151 }
akmhoque298385a2014-02-13 14:13:09 -0600152
akmhoquec8a10f72014-04-25 18:42:55 -0500153 NamePrefixTable&
154 getNamePrefixTable()
akmhoque53353462014-04-22 08:43:45 -0500155 {
akmhoquec8a10f72014-04-25 18:42:55 -0500156 return m_namePrefixTable;
akmhoque53353462014-04-22 08:43:45 -0500157 }
akmhoque298385a2014-02-13 14:13:09 -0600158
akmhoque53353462014-04-22 08:43:45 -0500159 Fib&
160 getFib()
161 {
162 return m_fib;
163 }
akmhoque298385a2014-02-13 14:13:09 -0600164
akmhoque53353462014-04-22 08:43:45 -0500165 long int
166 getAdjBuildCount()
167 {
168 return m_adjBuildCount;
169 }
akmhoque298385a2014-02-13 14:13:09 -0600170
akmhoque53353462014-04-22 08:43:45 -0500171 void
172 incrementAdjBuildCount()
173 {
174 m_adjBuildCount++;
175 }
akmhoque298385a2014-02-13 14:13:09 -0600176
akmhoque53353462014-04-22 08:43:45 -0500177 void
akmhoquefdbddb12014-05-02 18:35:19 -0500178 setAdjBuildCount(int64_t abc)
akmhoque53353462014-04-22 08:43:45 -0500179 {
180 m_adjBuildCount = abc;
181 }
akmhoque298385a2014-02-13 14:13:09 -0600182
akmhoque157b0a42014-05-13 00:26:37 -0500183 bool
akmhoque53353462014-04-22 08:43:45 -0500184 getIsBuildAdjLsaSheduled()
185 {
186 return m_isBuildAdjLsaSheduled;
187 }
akmhoque298385a2014-02-13 14:13:09 -0600188
akmhoque53353462014-04-22 08:43:45 -0500189 void
190 setIsBuildAdjLsaSheduled(bool iabls)
191 {
192 m_isBuildAdjLsaSheduled = iabls;
193 }
akmhoque298385a2014-02-13 14:13:09 -0600194
akmhoque53353462014-04-22 08:43:45 -0500195 bool
196 getIsRoutingTableCalculating()
197 {
198 return m_isRoutingTableCalculating;
199 }
akmhoque85d88332014-02-17 21:11:21 -0600200
akmhoque53353462014-04-22 08:43:45 -0500201 void
202 setIsRoutingTableCalculating(bool irtc)
203 {
204 m_isRoutingTableCalculating = irtc;
205 }
akmhoque298385a2014-02-13 14:13:09 -0600206
akmhoque53353462014-04-22 08:43:45 -0500207 bool
208 getIsRouteCalculationScheduled()
209 {
210 return m_isRouteCalculationScheduled;
211 }
akmhoque298385a2014-02-13 14:13:09 -0600212
akmhoque53353462014-04-22 08:43:45 -0500213 void
214 setIsRouteCalculationScheduled(bool ircs)
215 {
216 m_isRouteCalculationScheduled = ircs;
217 }
akmhoque298385a2014-02-13 14:13:09 -0600218
Muktadir R Chowdhury3ac07282016-06-17 16:30:29 -0500219 LsdbDatasetInterestHandler&
220 getLsdbDatasetHandler()
221 {
222 return m_lsdbDatasetHandler;
223 }
224
akmhoque53353462014-04-22 08:43:45 -0500225 void
226 initialize();
akmhoque1fd8c1e2014-02-19 19:41:49 -0600227
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700228 void
akmhoque443ad812014-07-29 10:26:56 -0500229 initializeKey();
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700230
231 void
232 loadValidator(boost::property_tree::ptree section,
233 const std::string& filename)
234 {
235 m_validator.load(section, filename);
236 }
237
238 Validator&
239 getValidator()
240 {
241 return m_validator;
242 }
243
244 void
dmcoomes9f936662017-03-02 10:33:09 -0600245 loadCertToPublish(std::shared_ptr<ndn::IdentityCertificate> certificate)
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700246 {
Vince Lehmanc2acdcb2015-04-29 11:14:35 -0500247 m_certStore.insert(certificate);
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700248 }
249
dmcoomes9f936662017-03-02 10:33:09 -0600250 std::shared_ptr<const ndn::IdentityCertificate>
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700251 getCertificate(const ndn::Name& certificateNameWithoutVersion)
252 {
Vince Lehmanc2acdcb2015-04-29 11:14:35 -0500253 shared_ptr<const ndn::IdentityCertificate> cert =
254 m_certStore.find(certificateNameWithoutVersion);
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700255
Vince Lehmanc2acdcb2015-04-29 11:14:35 -0500256 if (cert != nullptr) {
257 return cert;
258 }
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700259
260 return m_certificateCache->getCertificate(certificateNameWithoutVersion);
261 }
262
263 ndn::KeyChain&
264 getKeyChain()
265 {
266 return m_keyChain;
267 }
268
269 const ndn::Name&
270 getDefaultCertName()
271 {
272 return m_defaultCertName;
273 }
274
alvy297f4162015-03-03 17:15:33 -0600275 update::PrefixUpdateProcessor&
276 getPrefixUpdateProcessor()
277 {
278 return m_prefixUpdateProcessor;
279 }
280
Nick Gordon4d2c6c02017-01-20 13:18:46 -0600281 update::NfdRibCommandProcessor&
282 getNfdRibCommandProcessor()
283 {
284 return m_nfdRibCommandProcessor;
285 }
286
Nick Gordond1f4f332017-01-20 13:40:57 -0600287 ndn::mgmt::Dispatcher&
288 getDispatcher()
289 {
laqinfand22da512017-05-25 17:29:53 -0500290 return m_localhostDispatcher;
291 }
292
293 ndn::mgmt::Dispatcher&
294 getDispatcherRouterName()
295 {
296 return m_routerNameDispatcher;
Nick Gordond1f4f332017-01-20 13:40:57 -0600297 }
298
akmhoquee1765152014-06-30 11:32:01 -0500299 void
300 createFace(const std::string& faceUri,
akmhoquee1765152014-06-30 11:32:01 -0500301 const CommandSucceedCallback& onSuccess,
302 const CommandFailCallback& onFailure);
303
304 void
305 destroyFaces();
306
akmhoque157b0a42014-05-13 00:26:37 -0500307 void
akmhoquec04e7272014-07-02 11:00:14 -0500308 setStrategies();
akmhoque157b0a42014-05-13 00:26:37 -0500309
akmhoque0494c252014-07-23 23:46:44 -0500310 void
311 daemonize();
312
Vince Lehman7b616582014-10-17 16:25:39 -0500313 uint32_t
314 getFirstHelloInterval() const
315 {
316 return m_firstHelloInterval;
317 }
318
Nick Gordon9461afb2017-04-25 15:54:50 -0500319 /**
320 * \brief Canonize the URI for this and all proceeding neighbors in a list.
321 *
322 * This function canonizes the URI of the Adjacent object pointed to
323 * by currentNeighbor. It then executes the then callback, providing
324 * the next iterator in the list to the callback. A standard
325 * invocation would be to pass the begin() iterator of NLSR's
326 * adjacency list, and to provide Nlsr::canonizeContinuation as the
327 * callback. Because every URI must be canonical before we begin
328 * operations, the canonize function must call initialize itself.
329 *
330 * \sa Nlsr::canonizeContinuation
331 * \sa Nlsr::initialize
332 * \sa NlsrRunner::run
333 */
334 void
335 canonizeNeighborUris(std::list<Adjacent>::iterator currentNeighbor,
336 std::function<void(std::list<Adjacent>::iterator)> then);
337
338
alvy297f4162015-03-03 17:15:33 -0600339PUBLIC_WITH_TESTS_ELSE_PRIVATE:
340 void
dmcoomes9f936662017-03-02 10:33:09 -0600341 addCertificateToCache(std::shared_ptr<ndn::IdentityCertificate> certificate)
alvy297f4162015-03-03 17:15:33 -0600342 {
343 if (certificate != nullptr) {
344 m_certificateCache->insertCertificate(certificate);
345 }
346 }
347
Vince Lehmanc2acdcb2015-04-29 11:14:35 -0500348 security::CertificateStore&
349 getCertificateStore()
350 {
351 return m_certStore;
352 }
353
akmhoque393d4ff2014-07-16 14:27:03 -0500354private:
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700355 void
356 registerKeyPrefix();
357
358 void
alvy297f4162015-03-03 17:15:33 -0600359 registerLocalhostPrefix();
360
361 void
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700362 onKeyInterest(const ndn::Name& name, const ndn::Interest& interest);
363
364 void
365 onKeyPrefixRegSuccess(const ndn::Name& name);
366
akmhoquee1765152014-06-30 11:32:01 -0500367 void
akmhoquee1765152014-06-30 11:32:01 -0500368 onDestroyFaceSuccess(const ndn::nfd::ControlParameters& commandSuccessResult);
369
370 void
Junxiao Shi63bd0342016-08-17 16:57:14 +0000371 onDestroyFaceFailure(const ndn::nfd::ControlResponse& response);
akmhoquee1765152014-06-30 11:32:01 -0500372
373 void
akmhoquec04e7272014-07-02 11:00:14 -0500374 onFaceEventNotification(const ndn::nfd::FaceEventNotification& faceEventNotification);
akmhoquee1765152014-06-30 11:32:01 -0500375
Vince Lehman7b616582014-10-17 16:25:39 -0500376 void
377 setFirstHelloInterval(uint32_t interval)
378 {
379 m_firstHelloInterval = interval;
380 }
381
Nick Gordon9461afb2017-04-25 15:54:50 -0500382 /**
383 * \brief Continues canonizing neighbor URIs.
384 *
385 * For testability reasons, we want what each instance of
386 * canonization does after completion to be controllable. The best
387 * way to do this is to control that by simply passing a
388 * continuation function.
389 */
390 void
391 canonizeContinuation(std::list<Adjacent>::iterator iterator);
392
alvy297f4162015-03-03 17:15:33 -0600393public:
394 static const ndn::Name LOCALHOST_PREFIX;
395
akmhoque157b0a42014-05-13 00:26:37 -0500396private:
Vince Lehman904c2412014-09-23 19:36:11 -0500397 ndn::Face& m_nlsrFace;
Vince Lehman7c603292014-09-11 17:48:16 -0500398 ndn::Scheduler& m_scheduler;
Laqin Fana4cf4022017-01-03 18:57:35 +0000399 ndn::KeyChain& m_keyChain;
akmhoque53353462014-04-22 08:43:45 -0500400 ConfParameter m_confParam;
akmhoquec8a10f72014-04-25 18:42:55 -0500401 AdjacencyList m_adjacencyList;
402 NamePrefixList m_namePrefixList;
akmhoque53353462014-04-22 08:43:45 -0500403 bool m_isDaemonProcess;
akmhoquefdbddb12014-05-02 18:35:19 -0500404 std::string m_configFileName;
akmhoque53353462014-04-22 08:43:45 -0500405 Lsdb m_nlsrLsdb;
akmhoquefdbddb12014-05-02 18:35:19 -0500406 int64_t m_adjBuildCount;
akmhoque53353462014-04-22 08:43:45 -0500407 bool m_isBuildAdjLsaSheduled;
408 bool m_isRouteCalculationScheduled;
409 bool m_isRoutingTableCalculating;
akmhoque53353462014-04-22 08:43:45 -0500410 RoutingTable m_routingTable;
akmhoque53353462014-04-22 08:43:45 -0500411 Fib m_fib;
akmhoque31d1d4b2014-05-05 22:08:14 -0500412 NamePrefixTable m_namePrefixTable;
laqinfand22da512017-05-25 17:29:53 -0500413 ndn::mgmt::Dispatcher m_localhostDispatcher;
414 ndn::mgmt::Dispatcher m_routerNameDispatcher;
415
Vince Lehmand6bb3fa2015-04-24 14:21:39 -0500416 LsdbDatasetInterestHandler m_lsdbDatasetHandler;
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700417
Vince Lehmanf7eec4f2015-05-08 19:02:31 -0500418PUBLIC_WITH_TESTS_ELSE_PRIVATE:
419 HelloProtocol m_helloProtocol;
420
Vince Lehman7b616582014-10-17 16:25:39 -0500421private:
dmcoomes9f936662017-03-02 10:33:09 -0600422 std::shared_ptr<ndn::CertificateCacheTtl> m_certificateCache;
Vince Lehmanc2acdcb2015-04-29 11:14:35 -0500423 security::CertificateStore m_certStore;
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700424 Validator m_validator;
Joao Pereira97473d42015-07-03 16:57:27 -0400425 ndn::security::SigningInfo m_signingInfo;
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700426 ndn::Name m_defaultCertName;
alvy297f4162015-03-03 17:15:33 -0600427 update::PrefixUpdateProcessor m_prefixUpdateProcessor;
Nick Gordon4d2c6c02017-01-20 13:18:46 -0600428 update::NfdRibCommandProcessor m_nfdRibCommandProcessor;
akmhoquee1765152014-06-30 11:32:01 -0500429
akmhoque060d3022014-08-12 13:35:06 -0500430 ndn::nfd::FaceMonitor m_faceMonitor;
Vince Lehman7b616582014-10-17 16:25:39 -0500431
432 uint32_t m_firstHelloInterval;
akmhoque53353462014-04-22 08:43:45 -0500433};
akmhoque298385a2014-02-13 14:13:09 -0600434
Nick Gordonfad8e252016-08-11 14:21:38 -0500435} // namespace nlsr
akmhoqueb1710aa2014-02-19 17:13:36 -0600436
dmcoomes9f936662017-03-02 10:33:09 -0600437#endif // NLSR_NLSR_HPP