blob: bdb1d32f92829f86f312e4efb27aa8e78f34ab41 [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/*
Saurab Dulal427e0122019-11-28 11:58:02 -06003 * Copyright (c) 2014-2020, 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 **/
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
Vince Lehman50df6b72015-03-03 12:06:40 -060025#include "conf-parameter.hpp"
Ashlesh Gawande0db4d4d2020-02-05 20:30:02 -080026#include "lsa/lsa.hpp"
27#include "lsa/name-lsa.hpp"
28#include "lsa/coordinate-lsa.hpp"
29#include "lsa/adj-lsa.hpp"
Ashlesh Gawande3e105a02017-05-16 17:36:56 -050030#include "sequencing-manager.hpp"
Ashlesh Gawande5bf83172014-09-19 12:38:17 -050031#include "test-access-control.hpp"
Ashlesh Gawande3e105a02017-05-16 17:36:56 -050032#include "communication/sync-logic-handler.hpp"
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -060033#include "statistics.hpp"
Ashlesh Gawande85998a12017-12-07 22:22:13 -060034#include "route/name-prefix-table.hpp"
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -060035
36#include <ndn-cxx/security/key-chain.hpp>
37#include <ndn-cxx/util/signal.hpp>
38#include <ndn-cxx/util/time.hpp>
Ashlesh Gawande744e4812018-08-22 16:26:24 -050039#include <ndn-cxx/util/segment-fetcher.hpp>
Ashlesh Gawande15052402018-12-12 20:20:00 -060040#include <ndn-cxx/ims/in-memory-storage-persistent.hpp>
Ashlesh Gawande744e4812018-08-22 16:26:24 -050041
Ashlesh Gawande939b6f82018-12-09 16:51:09 -060042#include <PSync/segment-publisher.hpp>
43
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -060044#include <utility>
45#include <boost/cstdint.hpp>
akmhoque53353462014-04-22 08:43:45 -050046
Nick Gordone98480b2017-05-24 11:23:03 -050047namespace nlsr {
Alexander Afanasyev411ee4b2014-08-16 23:17:03 -070048
akmhoque53353462014-04-22 08:43:45 -050049class Lsdb
50{
51public:
Saurab Dulal427e0122019-11-28 11:58:02 -060052 Lsdb(ndn::Face& face, ndn::KeyChain& keyChain, ConfParameter& confParam,
Ashlesh Gawande85998a12017-12-07 22:22:13 -060053 NamePrefixTable& namePrefixTable, RoutingTable& routingTable);
Ashlesh Gawande3e105a02017-05-16 17:36:56 -050054
Ashlesh Gawande744e4812018-08-22 16:26:24 -050055 ~Lsdb();
56
akmhoque53353462014-04-22 08:43:45 -050057 bool
Nick Gordon727d4832017-10-13 18:04:25 -050058 isLsaNew(const ndn::Name& routerName, const Lsa::Type& lsaType, const uint64_t& sequenceNumber);
akmhoque53353462014-04-22 08:43:45 -050059
Nick Gordon8f23b5d2017-08-31 17:53:07 -050060 bool
Nick Gordon727d4832017-10-13 18:04:25 -050061 doesLsaExist(const ndn::Name& key, const Lsa::Type& lsType);
Nick G97e34942016-07-11 14:46:27 -050062
63 /*! \brief Builds a name LSA for this router and then installs it
64 into the LSDB.
65 */
akmhoque53353462014-04-22 08:43:45 -050066 bool
akmhoque31d1d4b2014-05-05 22:08:14 -050067 buildAndInstallOwnNameLsa();
akmhoque53353462014-04-22 08:43:45 -050068
Nick G97e34942016-07-11 14:46:27 -050069 /*! \brief Returns the name LSA with the given key.
70 \param key The name of the router that the desired LSA comes from.
71 */
akmhoqueb6450b12014-04-24 00:01:03 -050072 NameLsa*
akmhoque31d1d4b2014-05-05 22:08:14 -050073 findNameLsa(const ndn::Name& key);
akmhoque53353462014-04-22 08:43:45 -050074
Nick G97e34942016-07-11 14:46:27 -050075 /*! \brief Installs a name LSA into the LSDB
76 \param nlsa The name LSA to install into the LSDB.
77 */
akmhoque53353462014-04-22 08:43:45 -050078 bool
akmhoque31d1d4b2014-05-05 22:08:14 -050079 installNameLsa(NameLsa& nlsa);
akmhoque53353462014-04-22 08:43:45 -050080
Nick G97e34942016-07-11 14:46:27 -050081 /*! \brief Remove a name LSA from the LSDB.
82 \param key The name of the router that published the LSA to remove.
83
84 This function will remove a name LSA from the LSDB by finding an
85 LSA whose name matches key. This removal also causes the NPT to
86 remove those name prefixes if no more LSAs advertise them.
87 */
akmhoque53353462014-04-22 08:43:45 -050088 bool
akmhoque31d1d4b2014-05-05 22:08:14 -050089 removeNameLsa(const ndn::Name& key);
akmhoque53353462014-04-22 08:43:45 -050090
Nick G97e34942016-07-11 14:46:27 -050091 /*! Returns whether a seq. no. from a certain router signals a new LSA.
92 \param key The name of the originating router.
93 \param seqNo The sequence number to check.
94 */
akmhoque53353462014-04-22 08:43:45 -050095 bool
akmhoque31d1d4b2014-05-05 22:08:14 -050096 isNameLsaNew(const ndn::Name& key, uint64_t seqNo);
akmhoque53353462014-04-22 08:43:45 -050097
98 void
akmhoque2f423352014-06-03 11:49:35 -050099 writeNameLsdbLog();
akmhoque53353462014-04-22 08:43:45 -0500100
Jiewen Tana0497d82015-02-02 21:59:18 -0800101 const std::list<NameLsa>&
Nick Gordon114537f2017-08-09 14:51:37 -0500102 getNameLsdb() const;
Jiewen Tana0497d82015-02-02 21:59:18 -0800103
Nick G97e34942016-07-11 14:46:27 -0500104 /*! \brief Builds a cor. LSA for this router and installs it into the LSDB. */
akmhoque53353462014-04-22 08:43:45 -0500105 bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500106 buildAndInstallOwnCoordinateLsa();
akmhoque53353462014-04-22 08:43:45 -0500107
Nick G97e34942016-07-11 14:46:27 -0500108 /*! \brief Finds a cor. LSA in the LSDB.
109 \param key The name of the originating router that published the LSA.
110 */
akmhoqueb6450b12014-04-24 00:01:03 -0500111 CoordinateLsa*
akmhoque31d1d4b2014-05-05 22:08:14 -0500112 findCoordinateLsa(const ndn::Name& key);
akmhoque53353462014-04-22 08:43:45 -0500113
Nick G97e34942016-07-11 14:46:27 -0500114 /*! \brief Installs a cor. LSA into the LSDB.
115 \param clsa The cor. LSA to install.
116 */
akmhoque53353462014-04-22 08:43:45 -0500117 bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500118 installCoordinateLsa(CoordinateLsa& clsa);
akmhoque53353462014-04-22 08:43:45 -0500119
Nick G97e34942016-07-11 14:46:27 -0500120 /*! \brief Removes a cor. LSA from the LSDB.
121 \param key The name of the router that published the LSA to remove.
122
123 Removes the coordinate LSA whose origin router name matches that
124 given by key. Additionally, ask the NPT to remove the prefix,
125 which will occur if no other LSAs point there.
126 */
akmhoque53353462014-04-22 08:43:45 -0500127 bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500128 removeCoordinateLsa(const ndn::Name& key);
akmhoque53353462014-04-22 08:43:45 -0500129
Nick G97e34942016-07-11 14:46:27 -0500130 /*! \brief Returns whether a cor. LSA from a router is new or not.
131 \param key The name prefix of the originating router.
132 \param seqNo The sequence number of the candidate LSA.
133 */
akmhoque53353462014-04-22 08:43:45 -0500134 bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500135 isCoordinateLsaNew(const ndn::Name& key, uint64_t seqNo);
akmhoque53353462014-04-22 08:43:45 -0500136
137 void
akmhoque2f423352014-06-03 11:49:35 -0500138 writeCorLsdbLog();
akmhoque53353462014-04-22 08:43:45 -0500139
Jiewen Tana0497d82015-02-02 21:59:18 -0800140 const std::list<CoordinateLsa>&
Nick Gordon114537f2017-08-09 14:51:37 -0500141 getCoordinateLsdb() const;
Jiewen Tana0497d82015-02-02 21:59:18 -0800142
Nick G97e34942016-07-11 14:46:27 -0500143 //function related to Adj LSDB
144
145 /*! \brief Schedules a build of this router's LSA. */
akmhoque53353462014-04-22 08:43:45 -0500146 void
Vince Lehman50df6b72015-03-03 12:06:40 -0600147 scheduleAdjLsaBuild();
akmhoque53353462014-04-22 08:43:45 -0500148
Nick G97e34942016-07-11 14:46:27 -0500149 /*! \brief Wrapper event to build and install an adj. LSA for this router. */
akmhoque53353462014-04-22 08:43:45 -0500150 bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500151 buildAndInstallOwnAdjLsa();
akmhoque53353462014-04-22 08:43:45 -0500152
Nick G97e34942016-07-11 14:46:27 -0500153 /*! \brief Removes an adj. LSA from the LSDB.
154 \param key The name of the publishing router whose LSA to remove.
155 */
akmhoque53353462014-04-22 08:43:45 -0500156 bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500157 removeAdjLsa(const ndn::Name& key);
akmhoque53353462014-04-22 08:43:45 -0500158
Nick G97e34942016-07-11 14:46:27 -0500159 /*! \brief Returns whether an LSA is new.
160 \param key The name of the publishing router.
161 \param seqNo The seq. no. of the candidate LSA.
162
163 This function determines whether the LSA with the name key and
164 seq. no. seqNo would be new to this LSDB.
165 */
akmhoque53353462014-04-22 08:43:45 -0500166 bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500167 isAdjLsaNew(const ndn::Name& key, uint64_t seqNo);
Jiewen Tana0497d82015-02-02 21:59:18 -0800168
Nick G97e34942016-07-11 14:46:27 -0500169 /*! \brief Installs an adj. LSA into the LSDB.
170 \param alsa The adj. LSA to add to the LSDB.
171 */
akmhoque53353462014-04-22 08:43:45 -0500172 bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500173 installAdjLsa(AdjLsa& alsa);
akmhoque53353462014-04-22 08:43:45 -0500174
Nick G97e34942016-07-11 14:46:27 -0500175 /*! \brief Finds an adj. LSA in the LSDB.
176 \param key The name of the publishing router whose LSA to find.
177 */
akmhoqueb6450b12014-04-24 00:01:03 -0500178 AdjLsa*
akmhoque31d1d4b2014-05-05 22:08:14 -0500179 findAdjLsa(const ndn::Name& key);
akmhoque53353462014-04-22 08:43:45 -0500180
Jiewen Tana0497d82015-02-02 21:59:18 -0800181 const std::list<AdjLsa>&
Nick Gordon114537f2017-08-09 14:51:37 -0500182 getAdjLsdb() const;
akmhoque53353462014-04-22 08:43:45 -0500183
184 void
Vince Lehman50df6b72015-03-03 12:06:40 -0600185 setAdjLsaBuildInterval(uint32_t interval)
186 {
187 m_adjLsaBuildInterval = ndn::time::seconds(interval);
188 }
189
Vince Lehman50df6b72015-03-03 12:06:40 -0600190 void
akmhoque2f423352014-06-03 11:49:35 -0500191 writeAdjLsdbLog();
akmhoque53353462014-04-22 08:43:45 -0500192
akmhoque53353462014-04-22 08:43:45 -0500193 void
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -0500194 expressInterest(const ndn::Name& interestName, uint32_t timeoutCount,
Nick Gordone98480b2017-05-24 11:23:03 -0500195 ndn::time::steady_clock::TimePoint deadline = DEFAULT_LSA_RETRIEVAL_DEADLINE);
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -0500196
Ashlesh Gawande939b6f82018-12-09 16:51:09 -0600197 /* \brief Process interest which can be either:
198 * 1) Discovery interest from segment fetcher:
199 * /localhop/<network>/nlsr/LSA/<site>/<router>/<lsaType>/<seqNo>
200 * 2) Interest containing segment number:
201 * /localhop/<network>/nlsr/LSA/<site>/<router>/<lsaType>/<seqNo>/<version>/<segmentNo>
202 */
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -0500203 void
204 processInterest(const ndn::Name& name, const ndn::Interest& interest);
205
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600206 bool
207 getIsBuildAdjLsaSheduled()
208 {
209 return m_isBuildAdjLsaSheduled;
210 }
211
Ashlesh Gawande6b388fc2019-09-30 10:14:41 -0500212 SyncLogicHandler&
Ashlesh Gawande08bce9c2019-04-05 11:08:07 -0500213 getSync() {
214 return m_sync;
215 }
216
akmhoque53353462014-04-22 08:43:45 -0500217private:
Nick G97e34942016-07-11 14:46:27 -0500218 /* \brief Add a name LSA to the LSDB if it isn't already there.
219 \param nlsa The candidade name LSA.
220 */
akmhoque53353462014-04-22 08:43:45 -0500221 bool
222 addNameLsa(NameLsa& nlsa);
223
Nick G97e34942016-07-11 14:46:27 -0500224 /*! \brief Returns whether the LSDB contains some LSA.
225 \param key The name of the publishing router whose LSA to check for.
226 */
akmhoque53353462014-04-22 08:43:45 -0500227 bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500228 doesNameLsaExist(const ndn::Name& key);
akmhoque53353462014-04-22 08:43:45 -0500229
Nick G97e34942016-07-11 14:46:27 -0500230 /*! \brief Adds a cor. LSA to the LSDB if it isn't already there.
231 \param clsa The candidate cor. LSA.
232 */
akmhoque53353462014-04-22 08:43:45 -0500233 bool
akmhoqueb6450b12014-04-24 00:01:03 -0500234 addCoordinateLsa(CoordinateLsa& clsa);
akmhoque53353462014-04-22 08:43:45 -0500235
Nick G97e34942016-07-11 14:46:27 -0500236 /*! \brief Returns whether a cor. LSA is in the LSDB.
237 \param key The name of the router that published the queried LSA.
238 */
akmhoque53353462014-04-22 08:43:45 -0500239 bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500240 doesCoordinateLsaExist(const ndn::Name& key);
akmhoque53353462014-04-22 08:43:45 -0500241
Nick G97e34942016-07-11 14:46:27 -0500242 /*! \brief Attempts to construct an adj. LSA.
243
244 This function will attempt to construct an adjacency LSA. An LSA
245 can only be built when the status of all of the router's neighbors
246 is known. That is, when we are not currently trying to contact any
247 neighbor.
248 */
Vince Lehman50df6b72015-03-03 12:06:40 -0600249 void
250 buildAdjLsa();
251
Nick G97e34942016-07-11 14:46:27 -0500252 /*! \brief Adds an adj. LSA to the LSDB if it isn't already there.
253 \param alsa The candidate adj. LSA to add to the LSDB.
254 */
akmhoque53353462014-04-22 08:43:45 -0500255 bool
256 addAdjLsa(AdjLsa& alsa);
257
Nick G97e34942016-07-11 14:46:27 -0500258 /*! \brief Returns whether the LSDB contains an LSA.
259 \param key The name of a router whose LSA to check for in the LSDB.
260 */
akmhoque53353462014-04-22 08:43:45 -0500261 bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500262 doesAdjLsaExist(const ndn::Name& key);
akmhoque53353462014-04-22 08:43:45 -0500263
Nick G97e34942016-07-11 14:46:27 -0500264 /*! \brief Schedules a refresh/expire event in the scheduler.
265 \param key The name of the router that published the LSA.
266 \param seqNo The seq. no. associated with the LSA.
267 \param expTime How many seconds to wait before triggering the event.
268 */
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400269 ndn::scheduler::EventId
akmhoquec7a79b22014-05-26 08:06:19 -0500270 scheduleNameLsaExpiration(const ndn::Name& key, int seqNo,
Nick Gordone98480b2017-05-24 11:23:03 -0500271 const ndn::time::seconds& expTime);
akmhoque53353462014-04-22 08:43:45 -0500272
Nick G97e34942016-07-11 14:46:27 -0500273 /*! \brief Either allow to expire, or refresh a name LSA.
274 \param lsaKey The name of the router that published the LSA.
275 \param seqNo The seq. no. of the LSA to check.
276 */
akmhoque53353462014-04-22 08:43:45 -0500277 void
Ashlesh Gawande90173ad2017-08-09 15:19:50 -0500278 expireOrRefreshNameLsa(const ndn::Name& lsaKey, uint64_t seqNo);
akmhoque53353462014-04-22 08:43:45 -0500279
Vince Lehman199e9cf2015-04-07 13:22:16 -0500280PUBLIC_WITH_TESTS_ELSE_PRIVATE:
Nick G97e34942016-07-11 14:46:27 -0500281 /*! \brief Schedules an expire/refresh event in the LSA.
282 \param key The name of the router whose LSA is in question.
283 \param seqNo The sequence number of the LSA to check.
284 \param expTime The number of seconds to wait before triggering the event.
285 */
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400286 ndn::scheduler::EventId
akmhoquec7a79b22014-05-26 08:06:19 -0500287 scheduleAdjLsaExpiration(const ndn::Name& key, int seqNo,
Nick Gordone98480b2017-05-24 11:23:03 -0500288 const ndn::time::seconds& expTime);
akmhoque53353462014-04-22 08:43:45 -0500289
Vince Lehman199e9cf2015-04-07 13:22:16 -0500290private:
akmhoque53353462014-04-22 08:43:45 -0500291 void
Ashlesh Gawande90173ad2017-08-09 15:19:50 -0500292 expireOrRefreshAdjLsa(const ndn::Name& lsaKey, uint64_t seqNo);
akmhoque53353462014-04-22 08:43:45 -0500293
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400294 ndn::scheduler::EventId
akmhoque31d1d4b2014-05-05 22:08:14 -0500295 scheduleCoordinateLsaExpiration(const ndn::Name& key, int seqNo,
Nick Gordone98480b2017-05-24 11:23:03 -0500296 const ndn::time::seconds& expTime);
akmhoque53353462014-04-22 08:43:45 -0500297
298 void
Ashlesh Gawande90173ad2017-08-09 15:19:50 -0500299 expireOrRefreshCoordinateLsa(const ndn::Name& lsaKey,
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400300 uint64_t seqNo);
akmhoque53353462014-04-22 08:43:45 -0500301
akmhoque31d1d4b2014-05-05 22:08:14 -0500302 void
akmhoque31d1d4b2014-05-05 22:08:14 -0500303 processInterestForNameLsa(const ndn::Interest& interest,
304 const ndn::Name& lsaKey,
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500305 uint64_t seqNo);
akmhoque53353462014-04-22 08:43:45 -0500306
akmhoque31d1d4b2014-05-05 22:08:14 -0500307 void
308 processInterestForAdjacencyLsa(const ndn::Interest& interest,
309 const ndn::Name& lsaKey,
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500310 uint64_t seqNo);
akmhoque31d1d4b2014-05-05 22:08:14 -0500311
312 void
313 processInterestForCoordinateLsa(const ndn::Interest& interest,
314 const ndn::Name& lsaKey,
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500315 uint64_t seqNo);
Ashlesh Gawande15052402018-12-12 20:20:00 -0600316
akmhoque31d1d4b2014-05-05 22:08:14 -0500317 void
akmhoque31d1d4b2014-05-05 22:08:14 -0500318 processContentNameLsa(const ndn::Name& lsaKey,
Ashlesh Gawande0db4d4d2020-02-05 20:30:02 -0800319 uint64_t lsSeqNo, const ndn::Block& block);
akmhoque31d1d4b2014-05-05 22:08:14 -0500320
321 void
322 processContentAdjacencyLsa(const ndn::Name& lsaKey,
Ashlesh Gawande0db4d4d2020-02-05 20:30:02 -0800323 uint64_t lsSeqNo, const ndn::Block& block);
akmhoque31d1d4b2014-05-05 22:08:14 -0500324
325 void
326 processContentCoordinateLsa(const ndn::Name& lsaKey,
Ashlesh Gawande0db4d4d2020-02-05 20:30:02 -0800327 uint64_t lsSeqNo, const ndn::Block& block);
akmhoque31d1d4b2014-05-05 22:08:14 -0500328
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500329PUBLIC_WITH_TESTS_ELSE_PRIVATE:
Nick G97e34942016-07-11 14:46:27 -0500330 /*!
331 \brief Error callback when SegmentFetcher fails to return an LSA
332
333 In all error cases, a reattempt to fetch the LSA will be made.
334
335 Segment validation can fail either because the packet does not have a
336 valid signature (fatal) or because some of the certificates in the trust chain
337 could not be fetched (non-fatal).
338
339 Currently, the library does not provide clear indication (besides a plain-text message
340 in the error callback) of the reason for the failure nor the segment that failed
341 to be validated, thus we will continue to try to fetch the LSA until the deadline
342 is reached.
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -0500343 */
akmhoque31d1d4b2014-05-05 22:08:14 -0500344 void
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -0500345 onFetchLsaError(uint32_t errorCode,
346 const std::string& msg,
Ashlesh Gawande744e4812018-08-22 16:26:24 -0500347 const ndn::Name& interestName,
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -0500348 uint32_t retransmitNo,
349 const ndn::time::steady_clock::TimePoint& deadline,
350 ndn::Name lsaName,
351 uint64_t seqNo);
352
Nick G97e34942016-07-11 14:46:27 -0500353 /*!
354 \brief Success callback when SegmentFetcher returns a valid LSA
355
Nick Gordonb50e51b2016-07-22 16:05:57 -0500356 \param interestName The base Interest used to fetch the LSA in the format:
Nick G97e34942016-07-11 14:46:27 -0500357 /<network>/NLSR/LSA/<site>/%C1.Router/<router>/<lsa-type>/<seqNo>
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -0500358 */
359 void
Ashlesh Gawande0db4d4d2020-02-05 20:30:02 -0800360 afterFetchLsa(const ndn::ConstBufferPtr& bufferPtr, const ndn::Name& interestName);
akmhoque31d1d4b2014-05-05 22:08:14 -0500361
Saurab Dulal427e0122019-11-28 11:58:02 -0600362 void
363 emitSegmentValidatedSignal(const ndn::Data& data)
364 {
365 afterSegmentValidatedSignal(data);
366 }
367
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500368private:
Nick Gordone98480b2017-05-24 11:23:03 -0500369 ndn::time::system_clock::TimePoint
akmhoquec7a79b22014-05-26 08:06:19 -0500370 getLsaExpirationTimePoint();
371
Jiewen Tana0497d82015-02-02 21:59:18 -0800372public:
373 static const ndn::Name::Component NAME_COMPONENT;
374
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -0600375 ndn::util::signal::Signal<Lsdb, Statistics::PacketType> lsaIncrementSignal;
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600376 ndn::util::signal::Signal<Lsdb, const ndn::Data&> afterSegmentValidatedSignal;
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -0600377
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500378private:
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600379 ndn::Face& m_face;
380 ndn::Scheduler m_scheduler;
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600381
382 ConfParameter& m_confParam;
383 NamePrefixTable& m_namePrefixTable;
384 RoutingTable& m_routingTable;
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600385
386PUBLIC_WITH_TESTS_ELSE_PRIVATE:
Ashlesh Gawande15052402018-12-12 20:20:00 -0600387 SyncLogicHandler m_sync;
Vince Lehman7c603292014-09-11 17:48:16 -0500388
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600389private:
akmhoque53353462014-04-22 08:43:45 -0500390 std::list<NameLsa> m_nameLsdb;
391 std::list<AdjLsa> m_adjLsdb;
akmhoqueb6450b12014-04-24 00:01:03 -0500392 std::list<CoordinateLsa> m_corLsdb;
akmhoque53353462014-04-22 08:43:45 -0500393
Nick Gordone98480b2017-05-24 11:23:03 -0500394 ndn::time::seconds m_lsaRefreshTime;
akmhoque53353462014-04-22 08:43:45 -0500395 std::string m_thisRouterPrefix;
396
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500397 typedef std::map<ndn::Name, uint64_t> SequenceNumberMap;
398
399 // Maps the name of an LSA to its highest known sequence number from sync;
400 // Used to stop NLSR from trying to fetch outdated LSAs
401 SequenceNumberMap m_highestSeqNo;
402
Vince Lehman18841082014-08-19 17:15:24 -0500403 static const ndn::time::seconds GRACE_PERIOD;
Nick Gordone98480b2017-05-24 11:23:03 -0500404 static const ndn::time::steady_clock::TimePoint DEFAULT_LSA_RETRIEVAL_DEADLINE;
Vince Lehman50df6b72015-03-03 12:06:40 -0600405
Ashlesh Gawande15052402018-12-12 20:20:00 -0600406PUBLIC_WITH_TESTS_ELSE_PRIVATE:
Vince Lehman50df6b72015-03-03 12:06:40 -0600407 ndn::time::seconds m_adjLsaBuildInterval;
Ashlesh Gawande3e105a02017-05-16 17:36:56 -0500408
409 SequencingManager m_sequencingManager;
Nick Gordon9eac4d92017-08-29 17:31:29 -0500410
Ashlesh Gawande15052402018-12-12 20:20:00 -0600411private:
Nick Gordon9eac4d92017-08-29 17:31:29 -0500412 ndn::util::signal::ScopedConnection m_onNewLsaConnection;
Ashlesh Gawande744e4812018-08-22 16:26:24 -0500413
414 std::set<std::shared_ptr<ndn::util::SegmentFetcher>> m_fetchers;
Ashlesh Gawande939b6f82018-12-09 16:51:09 -0600415 psync::SegmentPublisher m_segmentPublisher;
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600416
417 bool m_isBuildAdjLsaSheduled;
418 int64_t m_adjBuildCount;
Ashlesh Gawande6b388fc2019-09-30 10:14:41 -0500419 ndn::scheduler::ScopedEventId m_scheduledAdjLsaBuild;
Ashlesh Gawande15052402018-12-12 20:20:00 -0600420
421PUBLIC_WITH_TESTS_ELSE_PRIVATE:
422 ndn::InMemoryStoragePersistent m_lsaStorage;
akmhoque53353462014-04-22 08:43:45 -0500423};
424
Nick Gordonfad8e252016-08-11 14:21:38 -0500425} // namespace nlsr
akmhoque53353462014-04-22 08:43:45 -0500426
dmcoomes9f936662017-03-02 10:33:09 -0600427#endif // NLSR_LSDB_HPP