blob: 7e1d9adcc63d1cfe71a1e7b895507d13efb66745 [file] [log] [blame]
akmhoque3d06e792014-05-27 16:23:20 -05001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Davide Pesaventoaf7a2112019-03-19 14:55:20 -04002/*
Junxiao Shif4674672024-01-06 02:27:36 +00003 * Copyright (c) 2014-2024, 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/>.
Ashlesh Gawande57a87172020-05-09 19:47:06 -070020 */
Ashlesh Gawande5bf83172014-09-19 12:38:17 -050021
akmhoque53353462014-04-22 08:43:45 -050022#ifndef NLSR_LSDB_HPP
23#define NLSR_LSDB_HPP
24
Davide Pesavento65ee9922022-11-16 00:21:43 -050025#include "communication/sync-logic-handler.hpp"
Vince Lehman50df6b72015-03-03 12:06:40 -060026#include "conf-parameter.hpp"
Ashlesh Gawande0db4d4d2020-02-05 20:30:02 -080027#include "lsa/lsa.hpp"
28#include "lsa/name-lsa.hpp"
29#include "lsa/coordinate-lsa.hpp"
30#include "lsa/adj-lsa.hpp"
Ashlesh Gawande3e105a02017-05-16 17:36:56 -050031#include "sequencing-manager.hpp"
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -060032#include "statistics.hpp"
Davide Pesavento65ee9922022-11-16 00:21:43 -050033#include "test-access-control.hpp"
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -060034
Davide Pesavento65ee9922022-11-16 00:21:43 -050035#include <ndn-cxx/ims/in-memory-storage-fifo.hpp>
36#include <ndn-cxx/ims/in-memory-storage-persistent.hpp>
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -060037#include <ndn-cxx/security/key-chain.hpp>
Davide Pesavento65ee9922022-11-16 00:21:43 -050038#include <ndn-cxx/util/segmenter.hpp>
39#include <ndn-cxx/util/segment-fetcher.hpp>
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -060040#include <ndn-cxx/util/signal.hpp>
41#include <ndn-cxx/util/time.hpp>
Ashlesh Gawande744e4812018-08-22 16:26:24 -050042
Ashlesh Gawande57a87172020-05-09 19:47:06 -070043#include <boost/multi_index_container.hpp>
Ashlesh Gawande57a87172020-05-09 19:47:06 -070044#include <boost/multi_index/composite_key.hpp>
Davide Pesavento65ee9922022-11-16 00:21:43 -050045#include <boost/multi_index/hashed_index.hpp>
Ashlesh Gawande939b6f82018-12-09 16:51:09 -060046
Nick Gordone98480b2017-05-24 11:23:03 -050047namespace nlsr {
Alexander Afanasyev411ee4b2014-08-16 23:17:03 -070048
Ashlesh Gawande57a87172020-05-09 19:47:06 -070049namespace bmi = boost::multi_index;
Ashlesh Gawande57a87172020-05-09 19:47:06 -070050
Davide Pesavento658fd852023-05-10 22:15:03 -040051inline constexpr ndn::time::seconds GRACE_PERIOD = 10_s;
Ashlesh Gawande57a87172020-05-09 19:47:06 -070052
Ashlesh Gawande5d93aa52020-06-13 18:57:45 -070053enum class LsdbUpdate {
54 INSTALLED,
55 UPDATED,
56 REMOVED
57};
58
akmhoque53353462014-04-22 08:43:45 -050059class Lsdb
60{
61public:
Ashlesh Gawande5d93aa52020-06-13 18:57:45 -070062 Lsdb(ndn::Face& face, ndn::KeyChain& keyChain, ConfParameter& confParam);
Ashlesh Gawande3e105a02017-05-16 17:36:56 -050063
Davide Pesavento65ee9922022-11-16 00:21:43 -050064 ~Lsdb();
Ashlesh Gawande744e4812018-08-22 16:26:24 -050065
Ashlesh Gawande57a87172020-05-09 19:47:06 -070066 /*! \brief Returns whether the LSDB contains some LSA.
67 */
akmhoque53353462014-04-22 08:43:45 -050068 bool
Ashlesh Gawande57a87172020-05-09 19:47:06 -070069 doesLsaExist(const ndn::Name& router, Lsa::Type lsaType)
70 {
71 return m_lsdb.get<byName>().find(std::make_tuple(router, lsaType)) != m_lsdb.end();
72 }
Nick G97e34942016-07-11 14:46:27 -050073
74 /*! \brief Builds a name LSA for this router and then installs it
75 into the LSDB.
76 */
Ashlesh Gawande57a87172020-05-09 19:47:06 -070077 void
akmhoque31d1d4b2014-05-05 22:08:14 -050078 buildAndInstallOwnNameLsa();
akmhoque53353462014-04-22 08:43:45 -050079
Ashlesh Gawande5d93aa52020-06-13 18:57:45 -070080PUBLIC_WITH_TESTS_ELSE_PRIVATE:
Nick G97e34942016-07-11 14:46:27 -050081 /*! \brief Builds a cor. LSA for this router and installs it into the LSDB. */
akmhoque53353462014-04-22 08:43:45 -050082 void
Ashlesh Gawande57a87172020-05-09 19:47:06 -070083 buildAndInstallOwnCoordinateLsa();
Nick G97e34942016-07-11 14:46:27 -050084
Ashlesh Gawande5d93aa52020-06-13 18:57:45 -070085public:
Nick G97e34942016-07-11 14:46:27 -050086 /*! \brief Schedules a build of this router's LSA. */
akmhoque53353462014-04-22 08:43:45 -050087 void
Vince Lehman50df6b72015-03-03 12:06:40 -060088 scheduleAdjLsaBuild();
akmhoque53353462014-04-22 08:43:45 -050089
akmhoque53353462014-04-22 08:43:45 -050090 void
Ashlesh Gawande57a87172020-05-09 19:47:06 -070091 writeLog() const;
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -050092
Ashlesh Gawande939b6f82018-12-09 16:51:09 -060093 /* \brief Process interest which can be either:
94 * 1) Discovery interest from segment fetcher:
95 * /localhop/<network>/nlsr/LSA/<site>/<router>/<lsaType>/<seqNo>
96 * 2) Interest containing segment number:
97 * /localhop/<network>/nlsr/LSA/<site>/<router>/<lsaType>/<seqNo>/<version>/<segmentNo>
98 */
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -050099 void
100 processInterest(const ndn::Name& name, const ndn::Interest& interest);
101
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600102 bool
Ashlesh Gawande5d93aa52020-06-13 18:57:45 -0700103 getIsBuildAdjLsaScheduled() const
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600104 {
Ashlesh Gawande5d93aa52020-06-13 18:57:45 -0700105 return m_isBuildAdjLsaScheduled;
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600106 }
107
Ashlesh Gawande6b388fc2019-09-30 10:14:41 -0500108 SyncLogicHandler&
Ashlesh Gawande57a87172020-05-09 19:47:06 -0700109 getSync()
110 {
Ashlesh Gawande08bce9c2019-04-05 11:08:07 -0500111 return m_sync;
112 }
113
Ashlesh Gawande57a87172020-05-09 19:47:06 -0700114 template<typename T>
115 std::shared_ptr<T>
116 findLsa(const ndn::Name& router) const
117 {
118 return std::static_pointer_cast<T>(findLsa(router, T::type()));
119 }
120
Junxiao Shi153fbc12024-01-09 23:37:23 +0000121 struct ExtractOriginRouter
122 {
123 using result_type = ndn::Name;
124
125 ndn::Name
126 operator()(const Lsa& lsa) const
127 {
128 return lsa.getOriginRouter();
129 }
130 };
131
Ashlesh Gawande57a87172020-05-09 19:47:06 -0700132 struct name_hash {
133 int
134 operator()(const ndn::Name& name) const {
135 return std::hash<ndn::Name>{}(name);
136 }
137 };
138
139 struct enum_class_hash {
140 template<typename T>
141 int
142 operator()(T t) const {
143 return static_cast<int>(t);
144 }
145 };
146
147 struct byName{};
148 struct byType{};
149
150 using LsaContainer = boost::multi_index_container<
151 std::shared_ptr<Lsa>,
152 bmi::indexed_by<
153 bmi::hashed_unique<
154 bmi::tag<byName>,
155 bmi::composite_key<
156 Lsa,
Junxiao Shi153fbc12024-01-09 23:37:23 +0000157 ExtractOriginRouter,
Ashlesh Gawande57a87172020-05-09 19:47:06 -0700158 bmi::const_mem_fun<Lsa, Lsa::Type, &Lsa::getType>
159 >,
160 bmi::composite_key_hash<name_hash, enum_class_hash>
161 >,
162 bmi::hashed_non_unique<
163 bmi::tag<byType>,
164 bmi::const_mem_fun<Lsa, Lsa::Type, &Lsa::getType>,
165 enum_class_hash
166 >
167 >
168 >;
169
170 template<typename T>
171 std::pair<LsaContainer::index<Lsdb::byType>::type::iterator,
172 LsaContainer::index<Lsdb::byType>::type::iterator>
173 getLsdbIterator() const
174 {
175 return m_lsdb.get<byType>().equal_range(T::type());
176 }
177
178PUBLIC_WITH_TESTS_ELSE_PRIVATE:
179 std::shared_ptr<Lsa>
180 findLsa(const ndn::Name& router, Lsa::Type lsaType) const
181 {
182 auto it = m_lsdb.get<byName>().find(std::make_tuple(router, lsaType));
183 return it != m_lsdb.end() ? *it : nullptr;
184 }
185
186 void
Davide Pesavento1954a0c2022-09-30 15:56:04 -0400187 incrementDataSentStats(Lsa::Type lsaType)
188 {
Ashlesh Gawande57a87172020-05-09 19:47:06 -0700189 if (lsaType == Lsa::Type::NAME) {
190 lsaIncrementSignal(Statistics::PacketType::SENT_NAME_LSA_DATA);
191 }
192 else if (lsaType == Lsa::Type::ADJACENCY) {
193 lsaIncrementSignal(Statistics::PacketType::SENT_ADJ_LSA_DATA);
194 }
195 else if (lsaType == Lsa::Type::COORDINATE) {
196 lsaIncrementSignal(Statistics::PacketType::SENT_COORD_LSA_DATA);
197 }
198 }
199
200 void
Davide Pesavento1954a0c2022-09-30 15:56:04 -0400201 incrementInterestRcvdStats(Lsa::Type lsaType)
202 {
Ashlesh Gawande57a87172020-05-09 19:47:06 -0700203 if (lsaType == Lsa::Type::NAME) {
204 lsaIncrementSignal(Statistics::PacketType::RCV_NAME_LSA_INTEREST);
205 }
206 else if (lsaType == Lsa::Type::ADJACENCY) {
207 lsaIncrementSignal(Statistics::PacketType::RCV_ADJ_LSA_INTEREST);
208 }
209 else if (lsaType == Lsa::Type::COORDINATE) {
210 lsaIncrementSignal(Statistics::PacketType::RCV_COORD_LSA_INTEREST);
211 }
212 }
213
214 void
Davide Pesavento1954a0c2022-09-30 15:56:04 -0400215 incrementInterestSentStats(Lsa::Type lsaType)
216 {
Ashlesh Gawande57a87172020-05-09 19:47:06 -0700217 if (lsaType == Lsa::Type::NAME) {
218 lsaIncrementSignal(Statistics::PacketType::SENT_NAME_LSA_INTEREST);
219 }
220 else if (lsaType == Lsa::Type::ADJACENCY) {
221 lsaIncrementSignal(Statistics::PacketType::SENT_ADJ_LSA_INTEREST);
222 }
223 else if (lsaType == Lsa::Type::COORDINATE) {
224 lsaIncrementSignal(Statistics::PacketType::SENT_COORD_LSA_INTEREST);
225 }
226 }
227
228 /*! Returns whether a seq. no. from a certain router signals a new LSA.
229 \param originRouter The name of the originating router.
230 \param lsaType The type of the LSA.
231 \param seqNo The sequence number to check.
Nick G97e34942016-07-11 14:46:27 -0500232 */
akmhoque53353462014-04-22 08:43:45 -0500233 bool
Junxiao Shif4674672024-01-06 02:27:36 +0000234 isLsaNew(const ndn::Name& originRouter, Lsa::Type lsaType, uint64_t seqNo) const
Ashlesh Gawande57a87172020-05-09 19:47:06 -0700235 {
236 // Is the name in the LSDB and the supplied seq no is the highest so far
237 auto lsaPtr = findLsa(originRouter, lsaType);
Davide Pesaventofd1e9402023-11-13 15:40:41 -0500238 return lsaPtr ? lsaPtr->getSeqNo() < seqNo : true;
Ashlesh Gawande57a87172020-05-09 19:47:06 -0700239 }
akmhoque53353462014-04-22 08:43:45 -0500240
Ashlesh Gawande57a87172020-05-09 19:47:06 -0700241 void
Davide Pesaventod90338d2021-01-07 17:50:05 -0500242 installLsa(std::shared_ptr<Lsa> lsa);
Ashlesh Gawande57a87172020-05-09 19:47:06 -0700243
244 /*! \brief Remove a name LSA from the LSDB.
245 \param router The name of the router that published the LSA to remove.
246 \param lsaType The type of the LSA.
247
248 This function will remove a name LSA from the LSDB by finding an
249 LSA whose name matches key. This removal also causes the NPT to
250 remove those name prefixes if no more LSAs advertise them.
Nick G97e34942016-07-11 14:46:27 -0500251 */
Ashlesh Gawande5d93aa52020-06-13 18:57:45 -0700252 void
Ashlesh Gawande57a87172020-05-09 19:47:06 -0700253 removeLsa(const ndn::Name& router, Lsa::Type lsaType);
akmhoque53353462014-04-22 08:43:45 -0500254
Ashlesh Gawande5d93aa52020-06-13 18:57:45 -0700255 void
256 removeLsa(const LsaContainer::index<Lsdb::byName>::type::iterator& lsaIt);
257
Nick G97e34942016-07-11 14:46:27 -0500258 /*! \brief Attempts to construct an adj. LSA.
259
260 This function will attempt to construct an adjacency LSA. An LSA
261 can only be built when the status of all of the router's neighbors
262 is known. That is, when we are not currently trying to contact any
263 neighbor.
264 */
Vince Lehman50df6b72015-03-03 12:06:40 -0600265 void
266 buildAdjLsa();
267
Ashlesh Gawande57a87172020-05-09 19:47:06 -0700268 /*! \brief Wrapper event to build and install an adj. LSA for this router. */
269 void
270 buildAndInstallOwnAdjLsa();
akmhoque53353462014-04-22 08:43:45 -0500271
Nick G97e34942016-07-11 14:46:27 -0500272 /*! \brief Schedules a refresh/expire event in the scheduler.
Ashlesh Gawande57a87172020-05-09 19:47:06 -0700273 \param lsa The LSA.
Nick G97e34942016-07-11 14:46:27 -0500274 \param expTime How many seconds to wait before triggering the event.
275 */
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400276 ndn::scheduler::EventId
Ashlesh Gawande5d93aa52020-06-13 18:57:45 -0700277 scheduleLsaExpiration(std::shared_ptr<Lsa> lsa, ndn::time::seconds expTime);
akmhoque53353462014-04-22 08:43:45 -0500278
Nick G97e34942016-07-11 14:46:27 -0500279 /*! \brief Either allow to expire, or refresh a name LSA.
Ashlesh Gawande57a87172020-05-09 19:47:06 -0700280 \param lsa The LSA.
Nick G97e34942016-07-11 14:46:27 -0500281 */
akmhoque53353462014-04-22 08:43:45 -0500282 void
Ashlesh Gawande57a87172020-05-09 19:47:06 -0700283 expireOrRefreshLsa(std::shared_ptr<Lsa> lsa);
akmhoque53353462014-04-22 08:43:45 -0500284
Ashlesh Gawande57a87172020-05-09 19:47:06 -0700285 bool
286 processInterestForLsa(const ndn::Interest& interest, const ndn::Name& originRouter,
287 Lsa::Type lsaType, uint64_t seqNo);
akmhoque53353462014-04-22 08:43:45 -0500288
289 void
Alexander Afanasyev135288c2022-04-23 23:06:56 -0400290 expressInterest(const ndn::Name& interestName, uint32_t timeoutCount, uint64_t incomingFaceId,
Davide Pesaventoc1d0e8e2022-06-15 14:26:02 -0400291 ndn::time::steady_clock::time_point deadline = DEFAULT_LSA_RETRIEVAL_DEADLINE);
akmhoque53353462014-04-22 08:43:45 -0500292
Nick G97e34942016-07-11 14:46:27 -0500293 /*!
294 \brief Error callback when SegmentFetcher fails to return an LSA
295
296 In all error cases, a reattempt to fetch the LSA will be made.
297
298 Segment validation can fail either because the packet does not have a
299 valid signature (fatal) or because some of the certificates in the trust chain
300 could not be fetched (non-fatal).
301
302 Currently, the library does not provide clear indication (besides a plain-text message
303 in the error callback) of the reason for the failure nor the segment that failed
304 to be validated, thus we will continue to try to fetch the LSA until the deadline
305 is reached.
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -0500306 */
akmhoque31d1d4b2014-05-05 22:08:14 -0500307 void
Ashlesh Gawande57a87172020-05-09 19:47:06 -0700308 onFetchLsaError(uint32_t errorCode, const std::string& msg,
309 const ndn::Name& interestName, uint32_t retransmitNo,
Davide Pesaventoc1d0e8e2022-06-15 14:26:02 -0400310 const ndn::time::steady_clock::time_point& deadline,
Ashlesh Gawande57a87172020-05-09 19:47:06 -0700311 ndn::Name lsaName, uint64_t seqNo);
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -0500312
Nick G97e34942016-07-11 14:46:27 -0500313 /*!
314 \brief Success callback when SegmentFetcher returns a valid LSA
315
Nick Gordonb50e51b2016-07-22 16:05:57 -0500316 \param interestName The base Interest used to fetch the LSA in the format:
Nick G97e34942016-07-11 14:46:27 -0500317 /<network>/NLSR/LSA/<site>/%C1.Router/<router>/<lsa-type>/<seqNo>
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -0500318 */
319 void
Ashlesh Gawande0db4d4d2020-02-05 20:30:02 -0800320 afterFetchLsa(const ndn::ConstBufferPtr& bufferPtr, const ndn::Name& interestName);
akmhoque31d1d4b2014-05-05 22:08:14 -0500321
Saurab Dulal427e0122019-11-28 11:58:02 -0600322 void
323 emitSegmentValidatedSignal(const ndn::Data& data)
324 {
325 afterSegmentValidatedSignal(data);
326 }
327
Davide Pesaventoc1d0e8e2022-06-15 14:26:02 -0400328 ndn::time::system_clock::time_point
Ashlesh Gawande57a87172020-05-09 19:47:06 -0700329 getLsaExpirationTimePoint() const
330 {
331 return ndn::time::system_clock::now() + ndn::time::seconds(m_confParam.getRouterDeadInterval());
332 }
akmhoquec7a79b22014-05-26 08:06:19 -0500333
Jiewen Tana0497d82015-02-02 21:59:18 -0800334public:
Junxiao Shi43f37a02023-08-09 00:09:00 +0000335 ndn::signal::Signal<Lsdb, Statistics::PacketType> lsaIncrementSignal;
336 ndn::signal::Signal<Lsdb, ndn::Data> afterSegmentValidatedSignal;
337 using AfterLsdbModified = ndn::signal::Signal<Lsdb, std::shared_ptr<Lsa>, LsdbUpdate,
338 std::list<ndn::Name>, std::list<ndn::Name>>;
Ashlesh Gawande5d93aa52020-06-13 18:57:45 -0700339 AfterLsdbModified onLsdbModified;
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -0600340
Ashlesh Gawande57a87172020-05-09 19:47:06 -0700341PUBLIC_WITH_TESTS_ELSE_PRIVATE:
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600342 ndn::Face& m_face;
343 ndn::Scheduler m_scheduler;
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600344 ConfParameter& m_confParam;
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600345
Ashlesh Gawande15052402018-12-12 20:20:00 -0600346 SyncLogicHandler m_sync;
Vince Lehman7c603292014-09-11 17:48:16 -0500347
Ashlesh Gawande57a87172020-05-09 19:47:06 -0700348 LsaContainer m_lsdb;
akmhoque53353462014-04-22 08:43:45 -0500349
Nick Gordone98480b2017-05-24 11:23:03 -0500350 ndn::time::seconds m_lsaRefreshTime;
Ashlesh Gawande57a87172020-05-09 19:47:06 -0700351 ndn::time::seconds m_adjLsaBuildInterval;
352 const ndn::Name& m_thisRouterPrefix;
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500353
354 // Maps the name of an LSA to its highest known sequence number from sync;
355 // Used to stop NLSR from trying to fetch outdated LSAs
Ashlesh Gawande57a87172020-05-09 19:47:06 -0700356 std::map<ndn::Name, uint64_t> m_highestSeqNo;
Ashlesh Gawande3e105a02017-05-16 17:36:56 -0500357
358 SequencingManager m_sequencingManager;
Nick Gordon9eac4d92017-08-29 17:31:29 -0500359
Junxiao Shi43f37a02023-08-09 00:09:00 +0000360 ndn::signal::ScopedConnection m_onNewLsaConnection;
Ashlesh Gawande744e4812018-08-22 16:26:24 -0500361
Junxiao Shi43f37a02023-08-09 00:09:00 +0000362 std::set<std::shared_ptr<ndn::SegmentFetcher>> m_fetchers;
363 ndn::Segmenter m_segmenter;
Davide Pesavento65ee9922022-11-16 00:21:43 -0500364 ndn::InMemoryStorageFifo m_segmentFifo;
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600365
Ashlesh Gawande5d93aa52020-06-13 18:57:45 -0700366 bool m_isBuildAdjLsaScheduled;
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600367 int64_t m_adjBuildCount;
Ashlesh Gawande6b388fc2019-09-30 10:14:41 -0500368 ndn::scheduler::ScopedEventId m_scheduledAdjLsaBuild;
Ashlesh Gawande15052402018-12-12 20:20:00 -0600369
Ashlesh Gawande15052402018-12-12 20:20:00 -0600370 ndn::InMemoryStoragePersistent m_lsaStorage;
Ashlesh Gawande57a87172020-05-09 19:47:06 -0700371
Davide Pesaventoc1d0e8e2022-06-15 14:26:02 -0400372 static inline const ndn::time::steady_clock::time_point DEFAULT_LSA_RETRIEVAL_DEADLINE =
373 ndn::time::steady_clock::time_point::min();
akmhoque53353462014-04-22 08:43:45 -0500374};
375
Nick Gordonfad8e252016-08-11 14:21:38 -0500376} // namespace nlsr
akmhoque53353462014-04-22 08:43:45 -0500377
dmcoomes9f936662017-03-02 10:33:09 -0600378#endif // NLSR_LSDB_HPP