blob: 2124cebdbaa0cd5fc364603352baee6d5e7a8f2f [file] [log] [blame]
akmhoque3d06e792014-05-27 16:23:20 -05001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Ashlesh Gawande7e3f6d72019-01-25 13:13:43 -06003 * Copyright (c) 2014-2019, 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
Ashlesh Gawande85998a12017-12-07 22:22:13 -060083 Nlsr(ndn::Face& face, ndn::KeyChain& keyChain, ConfParameter& confParam);
akmhoque298385a2014-02-13 14:13:09 -060084
akmhoque53353462014-04-22 08:43:45 -050085 void
Ashlesh Gawande08bce9c2019-04-05 11:08:07 -050086 registerStrategyForCerts(const ndn::Name& originRouter);
87
88 void
akmhoque53353462014-04-22 08:43:45 -050089 registrationFailed(const ndn::Name& name);
90
91 void
akmhoque157b0a42014-05-13 00:26:37 -050092 onRegistrationSuccess(const ndn::Name& name);
93
94 void
akmhoque31d1d4b2014-05-05 22:08:14 -050095 setInfoInterestFilter();
96
97 void
98 setLsaInterestFilter();
akmhoque53353462014-04-22 08:43:45 -050099
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500100 /*! \brief Add top level prefixes for Dispatcher
101 *
102 * All dispatcher-related sub-prefixes *must* be registered before sub-prefixes
103 * must be added before adding top
104 */
105 void
106 addDispatcherTopPrefix(const ndn::Name& topPrefix);
107
akmhoque53353462014-04-22 08:43:45 -0500108 Fib&
109 getFib()
110 {
111 return m_fib;
112 }
akmhoque298385a2014-02-13 14:13:09 -0600113
akmhoque53353462014-04-22 08:43:45 -0500114 void
115 initialize();
akmhoque1fd8c1e2014-02-19 19:41:49 -0600116
Nick Gordond5c1a372016-10-31 13:56:23 -0500117 /*! \brief Initializes neighbors' Faces using information from NFD.
118 * \sa Nlsr::initialize()
119 * \sa Nlsr::processFaceDataset()
120 *
121 * This function serves as the entry-point for initializing the
122 * neighbors listed in nlsr.conf during Nlsr::initialize(). NLSR
123 * will attempt to fetch a dataset of Faces from NFD, and configure
124 * each of its neighbors using information from that dataset. The
125 * explicit callbacks allow for better testability.
126 */
127 void
128 initializeFaces(const FetchDatasetCallback& onFetchSuccess,
129 const FetchDatasetTimeoutCallback& onFetchFailure);
130
131 void
132 onFaceDatasetFetchTimeout(uint32_t code,
133 const std::string& reason,
134 uint32_t nRetriesSoFar);
135
136 /*! \brief Consumes a Face StatusDataset to configure NLSR neighbors.
137 * \sa Nlsr::initializeFaces
138 * \param faces A Face Dataset that should conform to FaceMgmt specifications.
139 *
140 * This function processes a Face StatusDataset that should conform
141 * to the FaceMgmt specifications listed
142 * [here](https://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Face-Dataset).
143 * Any newly configured neighbors will have prefixes registered with NFD
144 * and be sent Hello Interests as well.
145 */
146 void
147 processFaceDataset(const std::vector<ndn::nfd::FaceStatus>& faces);
148
149 /*! \brief Registers NLSR-specific prefixes for a neighbor (Adjacent)
150 * \sa Nlsr::initializeFaces
151 * \param adj A reference to the neighbor to register prefixes for
152 * \param timeout The amount of time to give NFD to respond to *each* registration request.
153 *
154 * Registers the prefixes in NFD that NLSR needs to route with a
155 * neighbor. The timeout given is how long to set the timeout for
156 * *each* registration request that is made.
157 */
158 void
159 registerAdjacencyPrefixes(const Adjacent& adj,
160 const ndn::time::milliseconds& timeout);
161
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500162 /*! \brief Add a certificate NLSR claims to be authoritative for to the certificate store.
163 *
164 * \sa CertificateStore
165 */
166 void
167 loadCertToPublish(const ndn::security::v2::Certificate& certificate);
168
Muktadir Chowdhuryc3ea26f2018-01-05 21:40:59 +0000169 /*! \brief Callback when SegmentFetcher retrieves a segment.
170 */
171 void
172 afterFetcherSignalEmitted(const ndn::Data& lsaSegment);
173
174 /*! \brief Retrieves the chain of certificates from Validator's cache and
175 * store them in Nlsr's own CertificateStore.
176 * \param keyName Name of the first key in the certificate chain.
177 */
178 void
179 publishCertFromCache(const ndn::Name& keyName);
180
181 void
akmhoque443ad812014-07-29 10:26:56 -0500182 initializeKey();
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700183
Nick Gordond0a7df32017-05-30 16:44:34 -0500184 /*! \brief Find a certificate
185 *
186 * Find a certificate that NLSR has. First it checks against the
187 * certificates this NLSR claims to be authoritative for, usually
188 * something like this specific router's certificate, and then
189 * checks the cache of certficates it has already fetched. If none
190 * can be found, it will return an empty pointer.
191 */
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500192 const ndn::security::v2::Certificate*
193 getCertificate(const ndn::Name& certificateKeyName)
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700194 {
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500195 const ndn::security::v2::Certificate* cert =
196 m_certStore.find(certificateKeyName);
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700197
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500198 return cert;
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700199 }
200
akmhoquee1765152014-06-30 11:32:01 -0500201 void
akmhoquec04e7272014-07-02 11:00:14 -0500202 setStrategies();
akmhoque157b0a42014-05-13 00:26:37 -0500203
alvy297f4162015-03-03 17:15:33 -0600204PUBLIC_WITH_TESTS_ELSE_PRIVATE:
alvy297f4162015-03-03 17:15:33 -0600205
Vince Lehmanc2acdcb2015-04-29 11:14:35 -0500206 security::CertificateStore&
207 getCertificateStore()
208 {
209 return m_certStore;
210 }
211
akmhoque393d4ff2014-07-16 14:27:03 -0500212private:
Nick Gordond0a7df32017-05-30 16:44:34 -0500213 /*! \brief Registers the prefix that NLSR will use for key/certificate interests.
214 */
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700215 void
216 registerKeyPrefix();
217
Nick Gordond0a7df32017-05-30 16:44:34 -0500218 /*! \brief Registers the prefix that NLSR will consider to be the machine-local, secure prefix.
219 */
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700220 void
alvy297f4162015-03-03 17:15:33 -0600221 registerLocalhostPrefix();
222
Ashlesh Gawandecba0ae22018-03-27 17:57:56 -0500223 /*! \brief Registers the <router-prefix>/nlsr so that NLSR can respond to status requests from remote routers.
224 */
225 void
226 registerRouterPrefix();
227
Nick Gordond0a7df32017-05-30 16:44:34 -0500228 /*! \brief Attempts to satisfy an Interest for a certificate, and send it back.
229 */
alvy297f4162015-03-03 17:15:33 -0600230 void
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700231 onKeyInterest(const ndn::Name& name, const ndn::Interest& interest);
232
Nick Gordond0a7df32017-05-30 16:44:34 -0500233 /*! \brief Do nothing.
234 */
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700235 void
236 onKeyPrefixRegSuccess(const ndn::Name& name);
237
Nick Gordond0a7df32017-05-30 16:44:34 -0500238 /*! \brief Do nothing.
239 */
akmhoquee1765152014-06-30 11:32:01 -0500240 void
akmhoquec04e7272014-07-02 11:00:14 -0500241 onFaceEventNotification(const ndn::nfd::FaceEventNotification& faceEventNotification);
akmhoquee1765152014-06-30 11:32:01 -0500242
Vince Lehman7b616582014-10-17 16:25:39 -0500243 void
Nick Gordond5c1a372016-10-31 13:56:23 -0500244 scheduleDatasetFetch();
245
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500246 /*! \brief Enables NextHopFaceId indication in NFD for incoming data packet.
247 *
248 * After enabling, when NFD gets a data packet, it will put the incoming face id
249 * of the data in NextHopFaceId field of the packet. The NextHopFaceId will be used
250 * by DirectFetcher to fetch the certificates needed to validate the data packet.
251 * \sa https://redmine.named-data.net/projects/nfd/wiki/NDNLPv2#Consumer-Controlled-Forwarding
252 */
253 void
254 enableIncomingFaceIdIndication();
255
256 void
257 onFaceIdIndicationSuccess(const ndn::nfd::ControlParameters& cp);
258
259 void
260 onFaceIdIndicationFailure(const ndn::nfd::ControlResponse& cr);
261
alvy297f4162015-03-03 17:15:33 -0600262public:
263 static const ndn::Name LOCALHOST_PREFIX;
264
akmhoque157b0a42014-05-13 00:26:37 -0500265private:
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600266 ndn::Face& m_face;
267 ndn::Scheduler m_scheduler;
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500268 ndn::security::v2::KeyChain& m_keyChain;
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600269 ConfParameter& m_confParam;
270 AdjacencyList& m_adjacencyList;
271 NamePrefixList& m_namePrefixList;
272 bool m_isDaemonProcess;
273 ndn::security::ValidatorConfig& m_validator;
Ashlesh Gawande08bce9c2019-04-05 11:08:07 -0500274 std::vector<ndn::Name> m_strategySetOnRouters;
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700275
Vince Lehmanf7eec4f2015-05-08 19:02:31 -0500276PUBLIC_WITH_TESTS_ELSE_PRIVATE:
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600277 Fib m_fib;
278 RoutingTable m_routingTable;
279 NamePrefixTable m_namePrefixTable;
280 Lsdb m_lsdb;
Vince Lehmanf7eec4f2015-05-08 19:02:31 -0500281
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600282private:
283 ndn::util::signal::ScopedConnection m_afterSegmentValidatedConnection;
Ashlesh Gawande08bce9c2019-04-05 11:08:07 -0500284 ndn::util::signal::ScopedConnection m_onNewLsaConnection;
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600285
286PUBLIC_WITH_TESTS_ELSE_PRIVATE:
287 ndn::mgmt::Dispatcher m_dispatcher;
288 DatasetInterestHandler m_datasetHandler;
289 HelloProtocol m_helloProtocol;
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500290
Vince Lehman7b616582014-10-17 16:25:39 -0500291private:
Nick Gordond0a7df32017-05-30 16:44:34 -0500292 /*! \brief Where NLSR stores certificates it claims to be
293 * authoritative for. Usually the router certificate.
294 */
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600295 security::CertificateStore& m_certStore;
Nick Gordond5c1a372016-10-31 13:56:23 -0500296
Nick Gordond5c1a372016-10-31 13:56:23 -0500297 ndn::nfd::Controller m_controller;
298 ndn::nfd::Controller m_faceDatasetController;
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600299
300PUBLIC_WITH_TESTS_ELSE_PRIVATE:
Joao Pereira97473d42015-07-03 16:57:27 -0400301 ndn::security::SigningInfo m_signingInfo;
alvy297f4162015-03-03 17:15:33 -0600302 update::PrefixUpdateProcessor m_prefixUpdateProcessor;
Nick Gordon4d2c6c02017-01-20 13:18:46 -0600303 update::NfdRibCommandProcessor m_nfdRibCommandProcessor;
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600304
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -0600305 StatsCollector m_statsCollector;
akmhoquee1765152014-06-30 11:32:01 -0500306
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600307private:
akmhoque060d3022014-08-12 13:35:06 -0500308 ndn::nfd::FaceMonitor m_faceMonitor;
Vince Lehman7b616582014-10-17 16:25:39 -0500309
Nick Gordond5c1a372016-10-31 13:56:23 -0500310 friend class NlsrRunner;
akmhoque53353462014-04-22 08:43:45 -0500311};
akmhoque298385a2014-02-13 14:13:09 -0600312
Nick Gordonfad8e252016-08-11 14:21:38 -0500313} // namespace nlsr
akmhoqueb1710aa2014-02-19 17:13:36 -0600314
dmcoomes9f936662017-03-02 10:33:09 -0600315#endif // NLSR_NLSR_HPP