blob: d5ddd12d42e8814ca727e9d6f95e23f402bc7852 [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/*
laqinfan7c13ba52018-01-15 21:17:24 +00003 * 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
akmhoque53353462014-04-22 08:43:45 -050022#include "lsdb.hpp"
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -050023
akmhoque674b0b12014-05-20 14:33:28 -050024#include "logger.hpp"
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -050025#include "nlsr.hpp"
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -050026#include "utility/name-helper.hpp"
27
28#include <ndn-cxx/security/signing-helpers.hpp>
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -050029
akmhoque53353462014-04-22 08:43:45 -050030namespace nlsr {
31
dmcoomescf8d0ed2017-02-21 11:39:01 -060032INIT_LOGGER(Lsdb);
akmhoque674b0b12014-05-20 14:33:28 -050033
Jiewen Tana0497d82015-02-02 21:59:18 -080034const ndn::Name::Component Lsdb::NAME_COMPONENT = ndn::Name::Component("lsdb");
Vince Lehman18841082014-08-19 17:15:24 -050035const ndn::time::seconds Lsdb::GRACE_PERIOD = ndn::time::seconds(10);
Nick Gordone98480b2017-05-24 11:23:03 -050036const ndn::time::steady_clock::TimePoint Lsdb::DEFAULT_LSA_RETRIEVAL_DEADLINE =
37 ndn::time::steady_clock::TimePoint::min();
Vince Lehman18841082014-08-19 17:15:24 -050038
Ashlesh Gawande85998a12017-12-07 22:22:13 -060039Lsdb::Lsdb(ndn::Face& face, ndn::KeyChain& keyChain,
40 ndn::security::SigningInfo& signingInfo, ConfParameter& confParam,
41 NamePrefixTable& namePrefixTable, RoutingTable& routingTable)
42 : m_face(face)
43 , m_scheduler(face.getIoService())
44 , m_signingInfo(signingInfo)
45 , m_confParam(confParam)
46 , m_namePrefixTable(namePrefixTable)
47 , m_routingTable(routingTable)
48 , m_sync(m_face,
Nick Gordon727d4832017-10-13 18:04:25 -050049 [this] (const ndn::Name& routerName, const Lsa::Type& lsaType,
Nick Gordon9eac4d92017-08-29 17:31:29 -050050 const uint64_t& sequenceNumber) {
Nick Gordon8f23b5d2017-08-31 17:53:07 -050051 return isLsaNew(routerName, lsaType, sequenceNumber);
Ashlesh Gawande85998a12017-12-07 22:22:13 -060052 }, m_confParam)
Ashlesh Gawande85998a12017-12-07 22:22:13 -060053 , m_lsaRefreshTime(ndn::time::seconds(m_confParam.getLsaRefreshTime()))
54 , m_thisRouterPrefix(m_confParam.getRouterPrefix().toUri())
55 , m_adjLsaBuildInterval(m_confParam.getAdjLsaBuildInterval())
dulalsaurab82a34c22019-02-04 17:31:21 +000056 , m_sequencingManager(m_confParam.getStateFileDir(), m_confParam.getHyperbolicState())
Nick Gordon9eac4d92017-08-29 17:31:29 -050057 , m_onNewLsaConnection(m_sync.onNewLsa->connect(
Ashlesh Gawande08bce9c2019-04-05 11:08:07 -050058 [this] (const ndn::Name& updateName, uint64_t sequenceNumber,
59 const ndn::Name& originRouter) {
Nick Gordon9eac4d92017-08-29 17:31:29 -050060 ndn::Name lsaInterest{updateName};
61 lsaInterest.appendNumber(sequenceNumber);
62 expressInterest(lsaInterest, 0);
63 }))
Ashlesh Gawande85998a12017-12-07 22:22:13 -060064 , m_segmentPublisher(m_face, keyChain)
65 , m_isBuildAdjLsaSheduled(false)
66 , m_adjBuildCount(0)
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -050067{
68}
69
Ashlesh Gawande744e4812018-08-22 16:26:24 -050070Lsdb::~Lsdb()
71{
72 for (const auto& sp : m_fetchers) {
73 sp->stop();
74 }
75}
76
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -050077void
78Lsdb::onFetchLsaError(uint32_t errorCode,
79 const std::string& msg,
Ashlesh Gawande744e4812018-08-22 16:26:24 -050080 const ndn::Name& interestName,
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -050081 uint32_t retransmitNo,
82 const ndn::time::steady_clock::TimePoint& deadline,
83 ndn::Name lsaName,
84 uint64_t seqNo)
85{
dmcoomes5bcb39e2017-10-31 15:07:55 -050086 NLSR_LOG_DEBUG("Failed to fetch LSA: " << lsaName << ", Error code: " << errorCode
Davide Pesaventoaf7a2112019-03-19 14:55:20 -040087 << ", Message: " << msg);
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -050088
89 if (ndn::time::steady_clock::now() < deadline) {
Davide Pesaventoaf7a2112019-03-19 14:55:20 -040090 auto it = m_highestSeqNo.find(lsaName);
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -050091 if (it != m_highestSeqNo.end() && it->second == seqNo) {
92 // If the SegmentFetcher failed due to an Interest timeout, it is safe to re-express
93 // immediately since at the least the LSA Interest lifetime has elapsed.
94 // Otherwise, it is necessary to delay the Interest re-expression to prevent
95 // the potential for constant Interest flooding.
Ashlesh Gawande85998a12017-12-07 22:22:13 -060096 ndn::time::seconds delay = m_confParam.getLsaInterestLifetime();
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -050097
98 if (errorCode == ndn::util::SegmentFetcher::ErrorCode::INTEREST_TIMEOUT) {
99 delay = ndn::time::seconds(0);
100 }
101
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400102 m_scheduler.schedule(delay, std::bind(&Lsdb::expressInterest, this,
103 interestName, retransmitNo + 1, deadline));
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -0500104 }
105 }
106}
107
108void
Ashlesh Gawande744e4812018-08-22 16:26:24 -0500109Lsdb::afterFetchLsa(const ndn::ConstBufferPtr& bufferPtr, const ndn::Name& interestName)
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -0500110{
dmcoomes9f936662017-03-02 10:33:09 -0600111 std::shared_ptr<ndn::Data> data = std::make_shared<ndn::Data>(ndn::Name(interestName));
Ashlesh Gawande939b6f82018-12-09 16:51:09 -0600112 data->setContent(ndn::Block(bufferPtr));
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -0500113
dmcoomes5bcb39e2017-10-31 15:07:55 -0500114 NLSR_LOG_DEBUG("Received data for LSA(name): " << data->getName());
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -0500115
116 ndn::Name lsaName = interestName.getSubName(0, interestName.size()-1);
117 uint64_t seqNo = interestName[-1].toNumber();
118
119 if (m_highestSeqNo.find(lsaName) == m_highestSeqNo.end()) {
120 m_highestSeqNo[lsaName] = seqNo;
121 }
122 else if (seqNo > m_highestSeqNo[lsaName]) {
123 m_highestSeqNo[lsaName] = seqNo;
dmcoomes5bcb39e2017-10-31 15:07:55 -0500124 NLSR_LOG_TRACE("SeqNo for LSA(name): " << data->getName() << " updated");
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -0500125 }
126 else if (seqNo < m_highestSeqNo[lsaName]) {
127 return;
128 }
129
130 onContentValidated(data);
131}
akmhoque53353462014-04-22 08:43:45 -0500132
Nick G97e34942016-07-11 14:46:27 -0500133 /*! \brief Compares if a name LSA is the same as the one specified by key
134
135 \param nlsa1 A name LSA object
136 \param key A key of an originating router to compare to nlsa1
137 */
akmhoque53353462014-04-22 08:43:45 -0500138static bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500139nameLsaCompareByKey(const NameLsa& nlsa1, const ndn::Name& key)
akmhoque53353462014-04-22 08:43:45 -0500140{
141 return nlsa1.getKey() == key;
142}
143
akmhoque53353462014-04-22 08:43:45 -0500144bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500145Lsdb::buildAndInstallOwnNameLsa()
akmhoque53353462014-04-22 08:43:45 -0500146{
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600147 NameLsa nameLsa(m_confParam.getRouterPrefix(),
Ashlesh Gawande3e105a02017-05-16 17:36:56 -0500148 m_sequencingManager.getNameLsaSeq() + 1,
akmhoquec7a79b22014-05-26 08:06:19 -0500149 getLsaExpirationTimePoint(),
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600150 m_confParam.getNamePrefixList());
Ashlesh Gawande3e105a02017-05-16 17:36:56 -0500151 m_sequencingManager.increaseNameLsaSeq();
152
153 m_sequencingManager.writeSeqNoToFile();
Nick Gordon727d4832017-10-13 18:04:25 -0500154 m_sync.publishRoutingUpdate(Lsa::Type::NAME, m_sequencingManager.getNameLsaSeq());
Ashlesh Gawande3e105a02017-05-16 17:36:56 -0500155
akmhoque31d1d4b2014-05-05 22:08:14 -0500156 return installNameLsa(nameLsa);
akmhoque53353462014-04-22 08:43:45 -0500157}
158
akmhoqueb6450b12014-04-24 00:01:03 -0500159NameLsa*
akmhoque31d1d4b2014-05-05 22:08:14 -0500160Lsdb::findNameLsa(const ndn::Name& key)
akmhoque53353462014-04-22 08:43:45 -0500161{
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400162 auto it = std::find_if(m_nameLsdb.begin(), m_nameLsdb.end(),
163 std::bind(nameLsaCompareByKey, _1, key));
akmhoque157b0a42014-05-13 00:26:37 -0500164 if (it != m_nameLsdb.end()) {
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400165 return &*it;
akmhoque53353462014-04-22 08:43:45 -0500166 }
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400167 return nullptr;
akmhoque53353462014-04-22 08:43:45 -0500168}
169
170bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500171Lsdb::isNameLsaNew(const ndn::Name& key, uint64_t seqNo)
akmhoque53353462014-04-22 08:43:45 -0500172{
akmhoqueb6450b12014-04-24 00:01:03 -0500173 NameLsa* nameLsaCheck = findNameLsa(key);
Nick G97e34942016-07-11 14:46:27 -0500174 // Is the name in the LSDB
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400175 if (nameLsaCheck != nullptr) {
Nick G97e34942016-07-11 14:46:27 -0500176 // And the supplied seq no is the highest so far
akmhoque157b0a42014-05-13 00:26:37 -0500177 if (nameLsaCheck->getLsSeqNo() < seqNo) {
akmhoque53353462014-04-22 08:43:45 -0500178 return true;
179 }
akmhoque157b0a42014-05-13 00:26:37 -0500180 else {
akmhoque53353462014-04-22 08:43:45 -0500181 return false;
182 }
183 }
184 return true;
185}
186
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400187ndn::scheduler::EventId
akmhoquec7a79b22014-05-26 08:06:19 -0500188Lsdb::scheduleNameLsaExpiration(const ndn::Name& key, int seqNo,
189 const ndn::time::seconds& expTime)
akmhoque53353462014-04-22 08:43:45 -0500190{
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400191 return m_scheduler.schedule(expTime + GRACE_PERIOD,
192 std::bind(&Lsdb::expireOrRefreshNameLsa, this, key, seqNo));
akmhoque53353462014-04-22 08:43:45 -0500193}
194
195bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500196Lsdb::installNameLsa(NameLsa& nlsa)
akmhoque53353462014-04-22 08:43:45 -0500197{
Muktadir Chowdhuryc3ea26f2018-01-05 21:40:59 +0000198 NLSR_LOG_TRACE("installNameLsa");
Alexander Afanasyev8388ec62014-08-16 18:38:57 -0700199 ndn::time::seconds timeToExpire = m_lsaRefreshTime;
akmhoqueb6450b12014-04-24 00:01:03 -0500200 NameLsa* chkNameLsa = findNameLsa(nlsa.getKey());
Nick G97e34942016-07-11 14:46:27 -0500201 // Determines if the name LSA is new or not.
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400202 if (chkNameLsa == nullptr) {
akmhoque53353462014-04-22 08:43:45 -0500203 addNameLsa(nlsa);
dmcoomes5bcb39e2017-10-31 15:07:55 -0500204 NLSR_LOG_DEBUG("New Name LSA");
205 NLSR_LOG_DEBUG("Adding Name Lsa");
akmhoque53353462014-04-22 08:43:45 -0500206 nlsa.writeLog();
akmhoque674b0b12014-05-20 14:33:28 -0500207
Muktadir Chowdhuryc3ea26f2018-01-05 21:40:59 +0000208 NLSR_LOG_TRACE("nlsa.getOrigRouter(): " << nlsa.getOrigRouter());
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600209 NLSR_LOG_TRACE("m_confParam.getRouterPrefix(): " << m_confParam.getRouterPrefix());
Muktadir Chowdhuryc3ea26f2018-01-05 21:40:59 +0000210
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600211 if (nlsa.getOrigRouter() != m_confParam.getRouterPrefix()) {
Nick G97e34942016-07-11 14:46:27 -0500212 // If this name LSA is from another router, add the advertised
213 // prefixes to the NPT.
Ashlesh Gawande6b388fc2019-09-30 10:14:41 -0500214 m_namePrefixTable.addEntry(nlsa.getOrigRouter(), nlsa.getOrigRouter());
215
Ashlesh Gawandee8d8bd52018-08-09 17:18:51 -0500216 for (const auto& name : nlsa.getNpl().getNames()) {
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600217 if (name != m_confParam.getRouterPrefix()) {
218 m_namePrefixTable.addEntry(name, nlsa.getOrigRouter());
akmhoque53353462014-04-22 08:43:45 -0500219 }
220 }
dulalsaurabd0816a32019-07-26 13:11:24 +0000221 auto duration = nlsa.getExpirationTimePoint() - ndn::time::system_clock::now();
akmhoquec7a79b22014-05-26 08:06:19 -0500222 timeToExpire = ndn::time::duration_cast<ndn::time::seconds>(duration);
akmhoque53353462014-04-22 08:43:45 -0500223 }
dulalsaurabd0816a32019-07-26 13:11:24 +0000224
akmhoque31d1d4b2014-05-05 22:08:14 -0500225 nlsa.setExpiringEventId(scheduleNameLsaExpiration(nlsa.getKey(),
akmhoque53353462014-04-22 08:43:45 -0500226 nlsa.getLsSeqNo(),
227 timeToExpire));
228 }
Nick G97e34942016-07-11 14:46:27 -0500229 // Else this is a known name LSA, so we are updating it.
akmhoque157b0a42014-05-13 00:26:37 -0500230 else {
Muktadir Chowdhuryc3ea26f2018-01-05 21:40:59 +0000231 NLSR_LOG_TRACE("Known name lsa");
232 NLSR_LOG_TRACE("chkNameLsa->getLsSeqNo(): " << chkNameLsa->getLsSeqNo());
233 NLSR_LOG_TRACE("nlsa.getLsSeqNo(): " << nlsa.getLsSeqNo());
akmhoque157b0a42014-05-13 00:26:37 -0500234 if (chkNameLsa->getLsSeqNo() < nlsa.getLsSeqNo()) {
dmcoomes5bcb39e2017-10-31 15:07:55 -0500235 NLSR_LOG_DEBUG("Updated Name LSA. Updating LSDB");
236 NLSR_LOG_DEBUG("Deleting Name Lsa");
akmhoqueb6450b12014-04-24 00:01:03 -0500237 chkNameLsa->writeLog();
238 chkNameLsa->setLsSeqNo(nlsa.getLsSeqNo());
akmhoquec7a79b22014-05-26 08:06:19 -0500239 chkNameLsa->setExpirationTimePoint(nlsa.getExpirationTimePoint());
akmhoqueb6450b12014-04-24 00:01:03 -0500240 chkNameLsa->getNpl().sort();
akmhoque53353462014-04-22 08:43:45 -0500241 nlsa.getNpl().sort();
Nick G97e34942016-07-11 14:46:27 -0500242 // Obtain the set difference of the current and the incoming
243 // name prefix sets, and add those.
Nick Gordonf14ec352017-07-24 16:09:58 -0500244 std::list<ndn::Name> newNames = nlsa.getNpl().getNames();
245 std::list<ndn::Name> oldNames = chkNameLsa->getNpl().getNames();
246 std::list<ndn::Name> namesToAdd;
247 std::set_difference(newNames.begin(), newNames.end(), oldNames.begin(), oldNames.end(),
248 std::inserter(namesToAdd, namesToAdd.begin()));
Ashlesh Gawandee8d8bd52018-08-09 17:18:51 -0500249 for (const auto& name : namesToAdd) {
250 chkNameLsa->addName(name);
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600251 if (nlsa.getOrigRouter() != m_confParam.getRouterPrefix()) {
252 if (name != m_confParam.getRouterPrefix()) {
253 m_namePrefixTable.addEntry(name, nlsa.getOrigRouter());
akmhoque53353462014-04-22 08:43:45 -0500254 }
255 }
256 }
Vince Lehmanf1aa5232014-10-06 17:57:35 -0500257
258 chkNameLsa->getNpl().sort();
259
Nick G97e34942016-07-11 14:46:27 -0500260 // Also remove any names that are no longer being advertised.
Nick Gordonf14ec352017-07-24 16:09:58 -0500261 std::list<ndn::Name> namesToRemove;
262 std::set_difference(oldNames.begin(), oldNames.end(), newNames.begin(), newNames.end(),
263 std::inserter(namesToRemove, namesToRemove.begin()));
Ashlesh Gawandee8d8bd52018-08-09 17:18:51 -0500264 for (const auto& name : namesToRemove) {
265 NLSR_LOG_DEBUG("Removing name LSA no longer advertised: " << name);
266 chkNameLsa->removeName(name);
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600267 if (nlsa.getOrigRouter() != m_confParam.getRouterPrefix()) {
268 if (name != m_confParam.getRouterPrefix()) {
269 m_namePrefixTable.removeEntry(name, nlsa.getOrigRouter());
akmhoque53353462014-04-22 08:43:45 -0500270 }
271 }
272 }
dmcoomes9eaf3f42017-02-21 11:39:01 -0600273
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600274 if (nlsa.getOrigRouter() != m_confParam.getRouterPrefix()) {
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400275 auto duration = nlsa.getExpirationTimePoint() - ndn::time::system_clock::now();
akmhoquec7a79b22014-05-26 08:06:19 -0500276 timeToExpire = ndn::time::duration_cast<ndn::time::seconds>(duration);
akmhoque53353462014-04-22 08:43:45 -0500277 }
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400278 chkNameLsa->getExpiringEventId().cancel();
akmhoque31d1d4b2014-05-05 22:08:14 -0500279 chkNameLsa->setExpiringEventId(scheduleNameLsaExpiration(nlsa.getKey(),
akmhoqueb6450b12014-04-24 00:01:03 -0500280 nlsa.getLsSeqNo(),
281 timeToExpire));
dmcoomes5bcb39e2017-10-31 15:07:55 -0500282 NLSR_LOG_DEBUG("Adding Name Lsa");
akmhoqueb6450b12014-04-24 00:01:03 -0500283 chkNameLsa->writeLog();
akmhoque53353462014-04-22 08:43:45 -0500284 }
285 }
286 return true;
287}
288
289bool
290Lsdb::addNameLsa(NameLsa& nlsa)
291{
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400292 auto it = std::find_if(m_nameLsdb.begin(), m_nameLsdb.end(),
293 std::bind(nameLsaCompareByKey, _1, nlsa.getKey()));
akmhoque157b0a42014-05-13 00:26:37 -0500294 if (it == m_nameLsdb.end()) {
akmhoque53353462014-04-22 08:43:45 -0500295 m_nameLsdb.push_back(nlsa);
296 return true;
297 }
298 return false;
299}
300
301bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500302Lsdb::removeNameLsa(const ndn::Name& key)
akmhoque53353462014-04-22 08:43:45 -0500303{
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400304 auto it = std::find_if(m_nameLsdb.begin(), m_nameLsdb.end(),
305 std::bind(nameLsaCompareByKey, _1, key));
akmhoque157b0a42014-05-13 00:26:37 -0500306 if (it != m_nameLsdb.end()) {
dmcoomes5bcb39e2017-10-31 15:07:55 -0500307 NLSR_LOG_DEBUG("Deleting Name Lsa");
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400308 it->writeLog();
Nick G97e34942016-07-11 14:46:27 -0500309 // If the requested name LSA is not ours, we also need to remove
310 // its entries from the NPT.
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400311 if (it->getOrigRouter() != m_confParam.getRouterPrefix()) {
312 m_namePrefixTable.removeEntry(it->getOrigRouter(), it->getOrigRouter());
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600313
Nick Gordonf14ec352017-07-24 16:09:58 -0500314 for (const auto& name : it->getNpl().getNames()) {
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600315 if (name != m_confParam.getRouterPrefix()) {
316 m_namePrefixTable.removeEntry(name, it->getOrigRouter());
akmhoque53353462014-04-22 08:43:45 -0500317 }
318 }
319 }
320 m_nameLsdb.erase(it);
321 return true;
322 }
323 return false;
324}
325
326bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500327Lsdb::doesNameLsaExist(const ndn::Name& key)
akmhoque53353462014-04-22 08:43:45 -0500328{
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400329 auto it = std::find_if(m_nameLsdb.begin(), m_nameLsdb.end(),
330 std::bind(nameLsaCompareByKey, _1, key));
331 return it != m_nameLsdb.end();
akmhoque53353462014-04-22 08:43:45 -0500332}
333
334void
akmhoque2f423352014-06-03 11:49:35 -0500335Lsdb::writeNameLsdbLog()
akmhoque53353462014-04-22 08:43:45 -0500336{
dmcoomes5bcb39e2017-10-31 15:07:55 -0500337 NLSR_LOG_DEBUG("---------------Name LSDB-------------------");
Ashlesh Gawandee8d8bd52018-08-09 17:18:51 -0500338 for (const auto& nlsa : m_nameLsdb) {
339 nlsa.writeLog();
akmhoque53353462014-04-22 08:43:45 -0500340 }
341}
342
Jiewen Tana0497d82015-02-02 21:59:18 -0800343const std::list<NameLsa>&
Nick Gordon114537f2017-08-09 14:51:37 -0500344Lsdb::getNameLsdb() const
Jiewen Tana0497d82015-02-02 21:59:18 -0800345{
346 return m_nameLsdb;
347}
348
akmhoque53353462014-04-22 08:43:45 -0500349// Cor LSA and LSDB related Functions start here
350
Nick G97e34942016-07-11 14:46:27 -0500351/*! \brief Compares whether an LSA object is the same as a key.
352 \param clsa The cor. LSA to check the identity of.
353 \param key The key of the publishing router to check against.
354*/
akmhoque53353462014-04-22 08:43:45 -0500355static bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500356corLsaCompareByKey(const CoordinateLsa& clsa, const ndn::Name& key)
akmhoque53353462014-04-22 08:43:45 -0500357{
358 return clsa.getKey() == key;
359}
360
361bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500362Lsdb::buildAndInstallOwnCoordinateLsa()
akmhoque53353462014-04-22 08:43:45 -0500363{
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600364 CoordinateLsa corLsa(m_confParam.getRouterPrefix(),
Ashlesh Gawande3e105a02017-05-16 17:36:56 -0500365 m_sequencingManager.getCorLsaSeq() + 1,
akmhoquec7a79b22014-05-26 08:06:19 -0500366 getLsaExpirationTimePoint(),
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600367 m_confParam.getCorR(),
368 m_confParam.getCorTheta());
Nick Gordon5c467f02016-07-13 13:40:10 -0500369
370 // Sync coordinate LSAs if using HR or HR dry run.
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600371 if (m_confParam.getHyperbolicState() != HYPERBOLIC_STATE_OFF) {
Ashlesh Gawande3e105a02017-05-16 17:36:56 -0500372 m_sequencingManager.increaseCorLsaSeq();
373 m_sequencingManager.writeSeqNoToFile();
Nick Gordon727d4832017-10-13 18:04:25 -0500374 m_sync.publishRoutingUpdate(Lsa::Type::COORDINATE, m_sequencingManager.getCorLsaSeq());
Nick Gordon5c467f02016-07-13 13:40:10 -0500375 }
376
akmhoque31d1d4b2014-05-05 22:08:14 -0500377 installCoordinateLsa(corLsa);
Nick Gordon5c467f02016-07-13 13:40:10 -0500378
akmhoque53353462014-04-22 08:43:45 -0500379 return true;
380}
381
akmhoqueb6450b12014-04-24 00:01:03 -0500382CoordinateLsa*
akmhoque31d1d4b2014-05-05 22:08:14 -0500383Lsdb::findCoordinateLsa(const ndn::Name& key)
akmhoque53353462014-04-22 08:43:45 -0500384{
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400385 auto it = std::find_if(m_corLsdb.begin(), m_corLsdb.end(),
386 std::bind(corLsaCompareByKey, _1, key));
akmhoque157b0a42014-05-13 00:26:37 -0500387 if (it != m_corLsdb.end()) {
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400388 return &*it;
akmhoque53353462014-04-22 08:43:45 -0500389 }
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400390 return nullptr;
akmhoque53353462014-04-22 08:43:45 -0500391}
392
393bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500394Lsdb::isCoordinateLsaNew(const ndn::Name& key, uint64_t seqNo)
akmhoque53353462014-04-22 08:43:45 -0500395{
akmhoqueb6450b12014-04-24 00:01:03 -0500396 CoordinateLsa* clsa = findCoordinateLsa(key);
Nick G97e34942016-07-11 14:46:27 -0500397 // Is the coordinate LSA in the LSDB already
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400398 if (clsa != nullptr) {
Nick G97e34942016-07-11 14:46:27 -0500399 // And the seq no is newer (higher) than the current one
akmhoque157b0a42014-05-13 00:26:37 -0500400 if (clsa->getLsSeqNo() < seqNo) {
akmhoque53353462014-04-22 08:43:45 -0500401 return true;
402 }
akmhoque157b0a42014-05-13 00:26:37 -0500403 else {
akmhoque53353462014-04-22 08:43:45 -0500404 return false;
405 }
406 }
407 return true;
408}
409
Nick G97e34942016-07-11 14:46:27 -0500410 // Schedules a refresh/expire event in the scheduler.
411 // \param key The name of the router that published the LSA.
412 // \param seqNo the seq. no. associated with the LSA to check.
413 // \param expTime How long to wait before triggering the event.
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400414ndn::scheduler::EventId
akmhoque31d1d4b2014-05-05 22:08:14 -0500415Lsdb::scheduleCoordinateLsaExpiration(const ndn::Name& key, int seqNo,
akmhoquec7a79b22014-05-26 08:06:19 -0500416 const ndn::time::seconds& expTime)
akmhoque53353462014-04-22 08:43:45 -0500417{
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400418 return m_scheduler.schedule(expTime + GRACE_PERIOD,
419 std::bind(&Lsdb::expireOrRefreshCoordinateLsa, this, key, seqNo));
akmhoque53353462014-04-22 08:43:45 -0500420}
421
422bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500423Lsdb::installCoordinateLsa(CoordinateLsa& clsa)
akmhoque53353462014-04-22 08:43:45 -0500424{
Alexander Afanasyev8388ec62014-08-16 18:38:57 -0700425 ndn::time::seconds timeToExpire = m_lsaRefreshTime;
akmhoqueb6450b12014-04-24 00:01:03 -0500426 CoordinateLsa* chkCorLsa = findCoordinateLsa(clsa.getKey());
Nick G97e34942016-07-11 14:46:27 -0500427 // Checking whether the LSA is new or not.
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400428 if (chkCorLsa == nullptr) {
dmcoomes5bcb39e2017-10-31 15:07:55 -0500429 NLSR_LOG_DEBUG("New Coordinate LSA. Adding to LSDB");
430 NLSR_LOG_DEBUG("Adding Coordinate Lsa");
akmhoque674b0b12014-05-20 14:33:28 -0500431 clsa.writeLog();
akmhoqueb6450b12014-04-24 00:01:03 -0500432 addCoordinateLsa(clsa);
akmhoque2f423352014-06-03 11:49:35 -0500433
Nick Gordon5c467f02016-07-13 13:40:10 -0500434 // Register the LSA's origin router prefix
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600435 if (clsa.getOrigRouter() != m_confParam.getRouterPrefix()) {
436 m_namePrefixTable.addEntry(clsa.getOrigRouter(),
akmhoque31d1d4b2014-05-05 22:08:14 -0500437 clsa.getOrigRouter());
akmhoque53353462014-04-22 08:43:45 -0500438 }
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600439 if (m_confParam.getHyperbolicState() != HYPERBOLIC_STATE_OFF) {
440 m_routingTable.scheduleRoutingTableCalculation();
akmhoque53353462014-04-22 08:43:45 -0500441 }
Nick G97e34942016-07-11 14:46:27 -0500442 // Set the expiration time for the new LSA.
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600443 if (clsa.getOrigRouter() != m_confParam.getRouterPrefix()) {
akmhoquec7a79b22014-05-26 08:06:19 -0500444 ndn::time::system_clock::Duration duration = clsa.getExpirationTimePoint() -
445 ndn::time::system_clock::now();
446 timeToExpire = ndn::time::duration_cast<ndn::time::seconds>(duration);
akmhoque53353462014-04-22 08:43:45 -0500447 }
akmhoque31d1d4b2014-05-05 22:08:14 -0500448 scheduleCoordinateLsaExpiration(clsa.getKey(),
akmhoqueb6450b12014-04-24 00:01:03 -0500449 clsa.getLsSeqNo(), timeToExpire);
akmhoque53353462014-04-22 08:43:45 -0500450 }
Nick G97e34942016-07-11 14:46:27 -0500451 // We are just updating this LSA.
akmhoque157b0a42014-05-13 00:26:37 -0500452 else {
453 if (chkCorLsa->getLsSeqNo() < clsa.getLsSeqNo()) {
dmcoomes5bcb39e2017-10-31 15:07:55 -0500454 NLSR_LOG_DEBUG("Updated Coordinate LSA. Updating LSDB");
455 NLSR_LOG_DEBUG("Deleting Coordinate Lsa");
akmhoque674b0b12014-05-20 14:33:28 -0500456 chkCorLsa->writeLog();
akmhoqueb6450b12014-04-24 00:01:03 -0500457 chkCorLsa->setLsSeqNo(clsa.getLsSeqNo());
akmhoquec7a79b22014-05-26 08:06:19 -0500458 chkCorLsa->setExpirationTimePoint(clsa.getExpirationTimePoint());
Nick G97e34942016-07-11 14:46:27 -0500459 // If the new LSA contains new routing information, update the LSDB with it.
akmhoque157b0a42014-05-13 00:26:37 -0500460 if (!chkCorLsa->isEqualContent(clsa)) {
akmhoqueb6450b12014-04-24 00:01:03 -0500461 chkCorLsa->setCorRadius(clsa.getCorRadius());
462 chkCorLsa->setCorTheta(clsa.getCorTheta());
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600463 if (m_confParam.getHyperbolicState() >= HYPERBOLIC_STATE_ON) {
464 m_routingTable.scheduleRoutingTableCalculation();
akmhoque53353462014-04-22 08:43:45 -0500465 }
466 }
Nick G97e34942016-07-11 14:46:27 -0500467 // If this is an LSA from another router, refresh its expiration time.
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600468 if (clsa.getOrigRouter() != m_confParam.getRouterPrefix()) {
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400469 auto duration = clsa.getExpirationTimePoint() - ndn::time::system_clock::now();
akmhoquec7a79b22014-05-26 08:06:19 -0500470 timeToExpire = ndn::time::duration_cast<ndn::time::seconds>(duration);
akmhoque53353462014-04-22 08:43:45 -0500471 }
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400472 chkCorLsa->getExpiringEventId().cancel();
akmhoque31d1d4b2014-05-05 22:08:14 -0500473 chkCorLsa->setExpiringEventId(scheduleCoordinateLsaExpiration(clsa.getKey(),
akmhoqueb6450b12014-04-24 00:01:03 -0500474 clsa.getLsSeqNo(),
475 timeToExpire));
dmcoomes5bcb39e2017-10-31 15:07:55 -0500476 NLSR_LOG_DEBUG("Adding Coordinate Lsa");
akmhoque674b0b12014-05-20 14:33:28 -0500477 chkCorLsa->writeLog();
akmhoque53353462014-04-22 08:43:45 -0500478 }
479 }
480 return true;
481}
482
483bool
akmhoqueb6450b12014-04-24 00:01:03 -0500484Lsdb::addCoordinateLsa(CoordinateLsa& clsa)
akmhoque53353462014-04-22 08:43:45 -0500485{
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400486 auto it = std::find_if(m_corLsdb.begin(), m_corLsdb.end(),
487 std::bind(corLsaCompareByKey, _1, clsa.getKey()));
akmhoque157b0a42014-05-13 00:26:37 -0500488 if (it == m_corLsdb.end()) {
akmhoque53353462014-04-22 08:43:45 -0500489 m_corLsdb.push_back(clsa);
490 return true;
491 }
492 return false;
493}
494
495bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500496Lsdb::removeCoordinateLsa(const ndn::Name& key)
akmhoque53353462014-04-22 08:43:45 -0500497{
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400498 auto it = std::find_if(m_corLsdb.begin(), m_corLsdb.end(),
499 std::bind(corLsaCompareByKey, _1, key));
500
akmhoque157b0a42014-05-13 00:26:37 -0500501 if (it != m_corLsdb.end()) {
dmcoomes5bcb39e2017-10-31 15:07:55 -0500502 NLSR_LOG_DEBUG("Deleting Coordinate Lsa");
Nick Gordon5c467f02016-07-13 13:40:10 -0500503 it->writeLog();
504
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600505 if (it->getOrigRouter() != m_confParam.getRouterPrefix()) {
506 m_namePrefixTable.removeEntry(it->getOrigRouter(), it->getOrigRouter());
akmhoque53353462014-04-22 08:43:45 -0500507 }
Nick Gordon5c467f02016-07-13 13:40:10 -0500508
akmhoque53353462014-04-22 08:43:45 -0500509 m_corLsdb.erase(it);
510 return true;
511 }
512 return false;
513}
514
515bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500516Lsdb::doesCoordinateLsaExist(const ndn::Name& key)
akmhoque53353462014-04-22 08:43:45 -0500517{
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400518 auto it = std::find_if(m_corLsdb.begin(), m_corLsdb.end(),
519 std::bind(corLsaCompareByKey, _1, key));
520 return it != m_corLsdb.end();
akmhoque53353462014-04-22 08:43:45 -0500521}
522
523void
akmhoque2f423352014-06-03 11:49:35 -0500524Lsdb::writeCorLsdbLog()
akmhoque53353462014-04-22 08:43:45 -0500525{
Ashlesh Gawande6b388fc2019-09-30 10:14:41 -0500526 if (m_confParam.getHyperbolicState() == HYPERBOLIC_STATE_OFF) {
527 return;
528 }
529
dmcoomes5bcb39e2017-10-31 15:07:55 -0500530 NLSR_LOG_DEBUG("---------------Cor LSDB-------------------");
Ashlesh Gawandee8d8bd52018-08-09 17:18:51 -0500531 for (const auto& corLsa : m_corLsdb) {
532 corLsa.writeLog();
akmhoque53353462014-04-22 08:43:45 -0500533 }
534}
535
Jiewen Tana0497d82015-02-02 21:59:18 -0800536const std::list<CoordinateLsa>&
Nick Gordon114537f2017-08-09 14:51:37 -0500537Lsdb::getCoordinateLsdb() const
Jiewen Tana0497d82015-02-02 21:59:18 -0800538{
539 return m_corLsdb;
540}
541
akmhoque53353462014-04-22 08:43:45 -0500542// Adj LSA and LSDB related function starts here
543
Nick G97e34942016-07-11 14:46:27 -0500544 /*! \brief Returns whether an adj. LSA object is from some router.
545 \param alsa The adj. LSA object.
546 \param key The router name that you want to compare the LSA with.
547 */
akmhoque53353462014-04-22 08:43:45 -0500548static bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500549adjLsaCompareByKey(AdjLsa& alsa, const ndn::Name& key)
akmhoque53353462014-04-22 08:43:45 -0500550{
551 return alsa.getKey() == key;
552}
553
akmhoque53353462014-04-22 08:43:45 -0500554void
Vince Lehman50df6b72015-03-03 12:06:40 -0600555Lsdb::scheduleAdjLsaBuild()
akmhoque53353462014-04-22 08:43:45 -0500556{
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600557 m_adjBuildCount++;
Vince Lehman50df6b72015-03-03 12:06:40 -0600558
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600559 if (m_confParam.getHyperbolicState() == HYPERBOLIC_STATE_ON) {
Nick Gordon5c467f02016-07-13 13:40:10 -0500560 // Don't build adjacency LSAs in hyperbolic routing
dmcoomes5bcb39e2017-10-31 15:07:55 -0500561 NLSR_LOG_DEBUG("Adjacency LSA not built. Currently in hyperbolic routing state.");
Nick Gordon5c467f02016-07-13 13:40:10 -0500562 return;
563 }
564
Ashlesh Gawande6b388fc2019-09-30 10:14:41 -0500565 if (m_isBuildAdjLsaSheduled) {
566 NLSR_LOG_DEBUG("Rescheduling Adjacency LSA build in " << m_adjLsaBuildInterval);
567 }
568 else {
dmcoomes5bcb39e2017-10-31 15:07:55 -0500569 NLSR_LOG_DEBUG("Scheduling Adjacency LSA build in " << m_adjLsaBuildInterval);
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600570 m_isBuildAdjLsaSheduled = true;
Vince Lehman50df6b72015-03-03 12:06:40 -0600571 }
Ashlesh Gawande6b388fc2019-09-30 10:14:41 -0500572 m_scheduledAdjLsaBuild = m_scheduler.schedule(m_adjLsaBuildInterval, [this] { buildAdjLsa(); });
Vince Lehman50df6b72015-03-03 12:06:40 -0600573}
574
575void
576Lsdb::buildAdjLsa()
577{
dmcoomes5bcb39e2017-10-31 15:07:55 -0500578 NLSR_LOG_TRACE("Lsdb::buildAdjLsa called");
Vince Lehman50df6b72015-03-03 12:06:40 -0600579
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600580 m_isBuildAdjLsaSheduled = false;
Vince Lehmanf7eec4f2015-05-08 19:02:31 -0500581
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600582 if (m_confParam.getAdjacencyList().isAdjLsaBuildable(m_confParam.getInterestRetryNumber())) {
Vince Lehmanf7eec4f2015-05-08 19:02:31 -0500583
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600584 int adjBuildCount = m_adjBuildCount;
Nick G97e34942016-07-11 14:46:27 -0500585 // Only do the adjLsa build if there's one scheduled
akmhoque157b0a42014-05-13 00:26:37 -0500586 if (adjBuildCount > 0) {
Nick G97e34942016-07-11 14:46:27 -0500587 // It only makes sense to do the adjLsa build if we have neighbors
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600588 if (m_confParam.getAdjacencyList().getNumOfActiveNeighbor() > 0) {
dmcoomes5bcb39e2017-10-31 15:07:55 -0500589 NLSR_LOG_DEBUG("Building and installing own Adj LSA");
akmhoque31d1d4b2014-05-05 22:08:14 -0500590 buildAndInstallOwnAdjLsa();
akmhoque53353462014-04-22 08:43:45 -0500591 }
Nick G97e34942016-07-11 14:46:27 -0500592 // We have no active neighbors, meaning no one can route through
593 // us. So delete our entry in the LSDB. This prevents this
594 // router from refreshing the LSA, eventually causing other
595 // routers to delete it, too.
akmhoque157b0a42014-05-13 00:26:37 -0500596 else {
dmcoomes5bcb39e2017-10-31 15:07:55 -0500597 NLSR_LOG_DEBUG("Removing own Adj LSA; no ACTIVE neighbors");
Nick G97e34942016-07-11 14:46:27 -0500598 // Get this router's key
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600599 ndn::Name key = m_confParam.getRouterPrefix();
Nick Gordon727d4832017-10-13 18:04:25 -0500600 key.append(std::to_string(Lsa::Type::ADJACENCY));
Vince Lehmanf7eec4f2015-05-08 19:02:31 -0500601
akmhoque31d1d4b2014-05-05 22:08:14 -0500602 removeAdjLsa(key);
Nick G97e34942016-07-11 14:46:27 -0500603 // Recompute routing table after removal
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600604 m_routingTable.scheduleRoutingTableCalculation();
akmhoque53353462014-04-22 08:43:45 -0500605 }
Nick G97e34942016-07-11 14:46:27 -0500606 // In the case that during building the adj LSA, the FIB has to
607 // wait on an Interest response, the number of scheduled adj LSA
608 // builds could change, so we shouldn't just set it to 0.
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600609 m_adjBuildCount = m_adjBuildCount - adjBuildCount;
akmhoque53353462014-04-22 08:43:45 -0500610 }
611 }
Nick G97e34942016-07-11 14:46:27 -0500612 // We are still waiting to know the adjacency status of some
613 // neighbor, so schedule a build for later (when all that has
614 // hopefully finished)
615 else {
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600616 m_isBuildAdjLsaSheduled = true;
Ashlesh Gawande6b388fc2019-09-30 10:14:41 -0500617 auto schedulingTime = ndn::time::seconds(m_confParam.getInterestRetryNumber() *
618 m_confParam.getInterestResendTime());
619 m_scheduledAdjLsaBuild = m_scheduler.schedule(schedulingTime, [this] { buildAdjLsa(); });
Nick G97e34942016-07-11 14:46:27 -0500620 }
akmhoque53353462014-04-22 08:43:45 -0500621}
622
akmhoque53353462014-04-22 08:43:45 -0500623bool
624Lsdb::addAdjLsa(AdjLsa& alsa)
625{
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400626 auto it = std::find_if(m_adjLsdb.begin(), m_adjLsdb.end(),
627 std::bind(adjLsaCompareByKey, _1, alsa.getKey()));
akmhoque157b0a42014-05-13 00:26:37 -0500628 if (it == m_adjLsdb.end()) {
akmhoque53353462014-04-22 08:43:45 -0500629 m_adjLsdb.push_back(alsa);
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600630 // Add any new name prefixes to the NPT
631 // Only add NPT entries if this is an adj LSA from another router.
632 if (alsa.getOrigRouter() != m_confParam.getRouterPrefix()) {
633 // Pass the originating router as both the name to register and
634 // where it came from.
635 m_namePrefixTable.addEntry(alsa.getOrigRouter(), alsa.getOrigRouter());
636 }
akmhoque53353462014-04-22 08:43:45 -0500637 return true;
638 }
639 return false;
640}
641
akmhoqueb6450b12014-04-24 00:01:03 -0500642AdjLsa*
akmhoque31d1d4b2014-05-05 22:08:14 -0500643Lsdb::findAdjLsa(const ndn::Name& key)
akmhoque53353462014-04-22 08:43:45 -0500644{
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400645 auto it = std::find_if(m_adjLsdb.begin(), m_adjLsdb.end(),
646 std::bind(adjLsaCompareByKey, _1, key));
akmhoque157b0a42014-05-13 00:26:37 -0500647 if (it != m_adjLsdb.end()) {
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400648 return &*it;
akmhoque53353462014-04-22 08:43:45 -0500649 }
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400650 return nullptr;
akmhoque53353462014-04-22 08:43:45 -0500651}
652
akmhoque53353462014-04-22 08:43:45 -0500653bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500654Lsdb::isAdjLsaNew(const ndn::Name& key, uint64_t seqNo)
akmhoque53353462014-04-22 08:43:45 -0500655{
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400656 AdjLsa* adjLsaCheck = findAdjLsa(key);
Nick G97e34942016-07-11 14:46:27 -0500657 // If it is in the LSDB
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400658 if (adjLsaCheck != nullptr) {
Nick G97e34942016-07-11 14:46:27 -0500659 // And the supplied seq no is newer (higher) than the current one.
akmhoque157b0a42014-05-13 00:26:37 -0500660 if (adjLsaCheck->getLsSeqNo() < seqNo) {
akmhoque53353462014-04-22 08:43:45 -0500661 return true;
662 }
akmhoque157b0a42014-05-13 00:26:37 -0500663 else {
akmhoque53353462014-04-22 08:43:45 -0500664 return false;
665 }
666 }
667 return true;
668}
669
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400670ndn::scheduler::EventId
akmhoquec7a79b22014-05-26 08:06:19 -0500671Lsdb::scheduleAdjLsaExpiration(const ndn::Name& key, int seqNo,
672 const ndn::time::seconds& expTime)
akmhoque53353462014-04-22 08:43:45 -0500673{
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400674 return m_scheduler.schedule(expTime + GRACE_PERIOD,
675 std::bind(&Lsdb::expireOrRefreshAdjLsa, this, key, seqNo));
akmhoque53353462014-04-22 08:43:45 -0500676}
677
678bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500679Lsdb::installAdjLsa(AdjLsa& alsa)
akmhoque53353462014-04-22 08:43:45 -0500680{
Alexander Afanasyev8388ec62014-08-16 18:38:57 -0700681 ndn::time::seconds timeToExpire = m_lsaRefreshTime;
akmhoqueb6450b12014-04-24 00:01:03 -0500682 AdjLsa* chkAdjLsa = findAdjLsa(alsa.getKey());
Nick G97e34942016-07-11 14:46:27 -0500683 // If this adj. LSA is not in the LSDB already
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400684 if (chkAdjLsa == nullptr) {
dmcoomes5bcb39e2017-10-31 15:07:55 -0500685 NLSR_LOG_DEBUG("New Adj LSA. Adding to LSDB");
686 NLSR_LOG_DEBUG("Adding Adj Lsa");
akmhoque674b0b12014-05-20 14:33:28 -0500687 alsa.writeLog();
akmhoque53353462014-04-22 08:43:45 -0500688 addAdjLsa(alsa);
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600689
690 m_routingTable.scheduleRoutingTableCalculation();
691 if (alsa.getOrigRouter() != m_confParam.getRouterPrefix()) {
akmhoquec7a79b22014-05-26 08:06:19 -0500692 ndn::time::system_clock::Duration duration = alsa.getExpirationTimePoint() -
693 ndn::time::system_clock::now();
694 timeToExpire = ndn::time::duration_cast<ndn::time::seconds>(duration);
akmhoque53353462014-04-22 08:43:45 -0500695 }
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400696 scheduleAdjLsaExpiration(alsa.getKey(), alsa.getLsSeqNo(), timeToExpire);
akmhoque53353462014-04-22 08:43:45 -0500697 }
akmhoque157b0a42014-05-13 00:26:37 -0500698 else {
699 if (chkAdjLsa->getLsSeqNo() < alsa.getLsSeqNo()) {
dmcoomes5bcb39e2017-10-31 15:07:55 -0500700 NLSR_LOG_DEBUG("Updated Adj LSA. Updating LSDB");
701 NLSR_LOG_DEBUG("Deleting Adj Lsa");
akmhoque674b0b12014-05-20 14:33:28 -0500702 chkAdjLsa->writeLog();
akmhoqueb6450b12014-04-24 00:01:03 -0500703 chkAdjLsa->setLsSeqNo(alsa.getLsSeqNo());
akmhoquec7a79b22014-05-26 08:06:19 -0500704 chkAdjLsa->setExpirationTimePoint(alsa.getExpirationTimePoint());
Nick G97e34942016-07-11 14:46:27 -0500705 // If the new adj LSA has new content, update the contents of
706 // the LSDB entry. Additionally, since we've changed the
707 // contents of the LSDB, we have to schedule a routing
708 // calculation.
akmhoque157b0a42014-05-13 00:26:37 -0500709 if (!chkAdjLsa->isEqualContent(alsa)) {
akmhoqueb6450b12014-04-24 00:01:03 -0500710 chkAdjLsa->getAdl().reset();
akmhoquefdbddb12014-05-02 18:35:19 -0500711 chkAdjLsa->getAdl().addAdjacents(alsa.getAdl());
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600712 m_routingTable.scheduleRoutingTableCalculation();
akmhoque53353462014-04-22 08:43:45 -0500713 }
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600714 if (alsa.getOrigRouter() != m_confParam.getRouterPrefix()) {
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400715 auto duration = alsa.getExpirationTimePoint() - ndn::time::system_clock::now();
akmhoquec7a79b22014-05-26 08:06:19 -0500716 timeToExpire = ndn::time::duration_cast<ndn::time::seconds>(duration);
akmhoque53353462014-04-22 08:43:45 -0500717 }
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400718 chkAdjLsa->getExpiringEventId().cancel();
akmhoque31d1d4b2014-05-05 22:08:14 -0500719 chkAdjLsa->setExpiringEventId(scheduleAdjLsaExpiration(alsa.getKey(),
akmhoqueb6450b12014-04-24 00:01:03 -0500720 alsa.getLsSeqNo(),
721 timeToExpire));
dmcoomes5bcb39e2017-10-31 15:07:55 -0500722 NLSR_LOG_DEBUG("Adding Adj Lsa");
akmhoque674b0b12014-05-20 14:33:28 -0500723 chkAdjLsa->writeLog();
akmhoque53353462014-04-22 08:43:45 -0500724 }
725 }
726 return true;
727}
728
729bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500730Lsdb::buildAndInstallOwnAdjLsa()
akmhoque53353462014-04-22 08:43:45 -0500731{
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600732 AdjLsa adjLsa(m_confParam.getRouterPrefix(),
Ashlesh Gawande3e105a02017-05-16 17:36:56 -0500733 m_sequencingManager.getAdjLsaSeq() + 1,
akmhoquec7a79b22014-05-26 08:06:19 -0500734 getLsaExpirationTimePoint(),
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600735 m_confParam.getAdjacencyList().getNumOfActiveNeighbor(),
736 m_confParam.getAdjacencyList());
Vince Lehman904c2412014-09-23 19:36:11 -0500737
Nick Gordon5c467f02016-07-13 13:40:10 -0500738 //Sync adjacency LSAs if link-state or dry-run HR is enabled.
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600739 if (m_confParam.getHyperbolicState() != HYPERBOLIC_STATE_ON) {
Ashlesh Gawande3e105a02017-05-16 17:36:56 -0500740 m_sequencingManager.increaseAdjLsaSeq();
741 m_sequencingManager.writeSeqNoToFile();
Nick Gordon727d4832017-10-13 18:04:25 -0500742 m_sync.publishRoutingUpdate(Lsa::Type::ADJACENCY, m_sequencingManager.getAdjLsaSeq());
Nick Gordon5c467f02016-07-13 13:40:10 -0500743 }
Vince Lehman904c2412014-09-23 19:36:11 -0500744
Vince Lehman9d097802015-03-16 17:55:59 -0500745 return installAdjLsa(adjLsa);
akmhoque53353462014-04-22 08:43:45 -0500746}
747
748bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500749Lsdb::removeAdjLsa(const ndn::Name& key)
akmhoque53353462014-04-22 08:43:45 -0500750{
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400751 auto it = std::find_if(m_adjLsdb.begin(), m_adjLsdb.end(),
752 std::bind(adjLsaCompareByKey, _1, key));
akmhoque157b0a42014-05-13 00:26:37 -0500753 if (it != m_adjLsdb.end()) {
dmcoomes5bcb39e2017-10-31 15:07:55 -0500754 NLSR_LOG_DEBUG("Deleting Adj Lsa");
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600755 it->writeLog();
756 if (it->getOrigRouter() != m_confParam.getRouterPrefix()) {
757 m_namePrefixTable.removeEntry(it->getOrigRouter(), it->getOrigRouter());
758 }
akmhoque53353462014-04-22 08:43:45 -0500759 m_adjLsdb.erase(it);
760 return true;
761 }
762 return false;
763}
764
765bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500766Lsdb::doesAdjLsaExist(const ndn::Name& key)
akmhoque53353462014-04-22 08:43:45 -0500767{
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400768 auto it = std::find_if(m_adjLsdb.begin(), m_adjLsdb.end(),
769 std::bind(adjLsaCompareByKey, _1, key));
770 return it != m_adjLsdb.end();
akmhoque53353462014-04-22 08:43:45 -0500771}
772
Jiewen Tana0497d82015-02-02 21:59:18 -0800773const std::list<AdjLsa>&
Nick Gordon114537f2017-08-09 14:51:37 -0500774Lsdb::getAdjLsdb() const
akmhoque53353462014-04-22 08:43:45 -0500775{
776 return m_adjLsdb;
777}
778
Nick G97e34942016-07-11 14:46:27 -0500779 // This function determines whether a name LSA should be refreshed
780 // or expired. The conditions for getting refreshed are: it is still
781 // in the LSDB, it hasn't been updated by something else already (as
782 // evidenced by its seq. no.), and this is the originating router for
783 // the LSA. Is it let expire in all other cases.
784 // lsaKey is the key of the LSA's publishing router.
785 // seqNo is the seq. no. of the candidate LSA.
akmhoque53353462014-04-22 08:43:45 -0500786void
Ashlesh Gawande90173ad2017-08-09 15:19:50 -0500787Lsdb::expireOrRefreshNameLsa(const ndn::Name& lsaKey, uint64_t seqNo)
akmhoque53353462014-04-22 08:43:45 -0500788{
dmcoomes5bcb39e2017-10-31 15:07:55 -0500789 NLSR_LOG_DEBUG("Lsdb::expireOrRefreshNameLsa Called");
790 NLSR_LOG_DEBUG("LSA Key : " << lsaKey << " Seq No: " << seqNo);
akmhoqueb6450b12014-04-24 00:01:03 -0500791 NameLsa* chkNameLsa = findNameLsa(lsaKey);
Nick G97e34942016-07-11 14:46:27 -0500792 // If this name LSA exists in the LSDB
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400793 if (chkNameLsa != nullptr) {
dmcoomes5bcb39e2017-10-31 15:07:55 -0500794 NLSR_LOG_DEBUG("LSA Exists with seq no: " << chkNameLsa->getLsSeqNo());
Nick G97e34942016-07-11 14:46:27 -0500795 // If its seq no is the one we are expecting.
akmhoque157b0a42014-05-13 00:26:37 -0500796 if (chkNameLsa->getLsSeqNo() == seqNo) {
797 if (chkNameLsa->getOrigRouter() == m_thisRouterPrefix) {
dmcoomes5bcb39e2017-10-31 15:07:55 -0500798 NLSR_LOG_DEBUG("Own Name LSA, so refreshing it");
799 NLSR_LOG_DEBUG("Deleting Name Lsa");
akmhoqueb6450b12014-04-24 00:01:03 -0500800 chkNameLsa->writeLog();
akmhoqueb6450b12014-04-24 00:01:03 -0500801 chkNameLsa->setLsSeqNo(chkNameLsa->getLsSeqNo() + 1);
Ashlesh Gawande3e105a02017-05-16 17:36:56 -0500802 m_sequencingManager.setNameLsaSeq(chkNameLsa->getLsSeqNo());
akmhoquec7a79b22014-05-26 08:06:19 -0500803 chkNameLsa->setExpirationTimePoint(getLsaExpirationTimePoint());
dmcoomes5bcb39e2017-10-31 15:07:55 -0500804 NLSR_LOG_DEBUG("Adding Name Lsa");
akmhoqueb6450b12014-04-24 00:01:03 -0500805 chkNameLsa->writeLog();
akmhoquefdbddb12014-05-02 18:35:19 -0500806 // schedule refreshing event again
akmhoque31d1d4b2014-05-05 22:08:14 -0500807 chkNameLsa->setExpiringEventId(scheduleNameLsaExpiration(chkNameLsa->getKey(),
akmhoquefdbddb12014-05-02 18:35:19 -0500808 chkNameLsa->getLsSeqNo(),
Alexander Afanasyev8388ec62014-08-16 18:38:57 -0700809 m_lsaRefreshTime));
Ashlesh Gawande3e105a02017-05-16 17:36:56 -0500810 m_sequencingManager.writeSeqNoToFile();
Nick Gordon727d4832017-10-13 18:04:25 -0500811 m_sync.publishRoutingUpdate(Lsa::Type::NAME, m_sequencingManager.getNameLsaSeq());
akmhoque53353462014-04-22 08:43:45 -0500812 }
Nick G97e34942016-07-11 14:46:27 -0500813 // Since we cannot refresh other router's LSAs, our only choice is to expire.
akmhoque157b0a42014-05-13 00:26:37 -0500814 else {
dmcoomes5bcb39e2017-10-31 15:07:55 -0500815 NLSR_LOG_DEBUG("Other's Name LSA, so removing from LSDB");
akmhoque31d1d4b2014-05-05 22:08:14 -0500816 removeNameLsa(lsaKey);
akmhoque53353462014-04-22 08:43:45 -0500817 }
818 }
819 }
820}
821
Nick G97e34942016-07-11 14:46:27 -0500822 // This function determines whether an adj. LSA should be refreshed
823 // or expired. The conditions for getting refreshed are: it is still
824 // in the LSDB, it hasn't been updated by something else already (as
825 // evidenced by its seq. no.), and this is the originating router for
826 // the LSA. Is it let expire in all other cases.
827 // lsaKey is the key of the LSA's publishing router.
828 // seqNo is the seq. no. of the candidate LSA.
akmhoque53353462014-04-22 08:43:45 -0500829void
Ashlesh Gawande90173ad2017-08-09 15:19:50 -0500830Lsdb::expireOrRefreshAdjLsa(const ndn::Name& lsaKey, uint64_t seqNo)
akmhoque53353462014-04-22 08:43:45 -0500831{
dmcoomes5bcb39e2017-10-31 15:07:55 -0500832 NLSR_LOG_DEBUG("Lsdb::expireOrRefreshAdjLsa Called");
833 NLSR_LOG_DEBUG("LSA Key: " << lsaKey << " Seq No: " << seqNo);
akmhoqueb6450b12014-04-24 00:01:03 -0500834 AdjLsa* chkAdjLsa = findAdjLsa(lsaKey);
Nick G97e34942016-07-11 14:46:27 -0500835 // If this is a valid LSA
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400836 if (chkAdjLsa != nullptr) {
dmcoomes5bcb39e2017-10-31 15:07:55 -0500837 NLSR_LOG_DEBUG("LSA Exists with seq no: " << chkAdjLsa->getLsSeqNo());
Nick G97e34942016-07-11 14:46:27 -0500838 // And if it hasn't been updated for some other reason
akmhoque157b0a42014-05-13 00:26:37 -0500839 if (chkAdjLsa->getLsSeqNo() == seqNo) {
Nick G97e34942016-07-11 14:46:27 -0500840 // If it is our own LSA
akmhoque157b0a42014-05-13 00:26:37 -0500841 if (chkAdjLsa->getOrigRouter() == m_thisRouterPrefix) {
dmcoomes5bcb39e2017-10-31 15:07:55 -0500842 NLSR_LOG_DEBUG("Own Adj LSA, so refreshing it");
843 NLSR_LOG_DEBUG("Deleting Adj Lsa");
akmhoque2f423352014-06-03 11:49:35 -0500844 chkAdjLsa->writeLog();
akmhoqueb6450b12014-04-24 00:01:03 -0500845 chkAdjLsa->setLsSeqNo(chkAdjLsa->getLsSeqNo() + 1);
Ashlesh Gawande3e105a02017-05-16 17:36:56 -0500846 m_sequencingManager.setAdjLsaSeq(chkAdjLsa->getLsSeqNo());
akmhoquec7a79b22014-05-26 08:06:19 -0500847 chkAdjLsa->setExpirationTimePoint(getLsaExpirationTimePoint());
dmcoomes5bcb39e2017-10-31 15:07:55 -0500848 NLSR_LOG_DEBUG("Adding Adj Lsa");
akmhoque2f423352014-06-03 11:49:35 -0500849 chkAdjLsa->writeLog();
akmhoquefdbddb12014-05-02 18:35:19 -0500850 // schedule refreshing event again
akmhoque31d1d4b2014-05-05 22:08:14 -0500851 chkAdjLsa->setExpiringEventId(scheduleAdjLsaExpiration(chkAdjLsa->getKey(),
akmhoquefdbddb12014-05-02 18:35:19 -0500852 chkAdjLsa->getLsSeqNo(),
Alexander Afanasyev8388ec62014-08-16 18:38:57 -0700853 m_lsaRefreshTime));
Ashlesh Gawande3e105a02017-05-16 17:36:56 -0500854 m_sequencingManager.writeSeqNoToFile();
Nick Gordon727d4832017-10-13 18:04:25 -0500855 m_sync.publishRoutingUpdate(Lsa::Type::ADJACENCY, m_sequencingManager.getAdjLsaSeq());
akmhoque53353462014-04-22 08:43:45 -0500856 }
Nick G97e34942016-07-11 14:46:27 -0500857 // An LSA from another router is expiring
akmhoque157b0a42014-05-13 00:26:37 -0500858 else {
dmcoomes5bcb39e2017-10-31 15:07:55 -0500859 NLSR_LOG_DEBUG("Other's Adj LSA, so removing from LSDB");
akmhoque31d1d4b2014-05-05 22:08:14 -0500860 removeAdjLsa(lsaKey);
akmhoque53353462014-04-22 08:43:45 -0500861 }
Nick G97e34942016-07-11 14:46:27 -0500862 // We have changed the contents of the LSDB, so we have to
863 // schedule a routing calculation
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600864 m_routingTable.scheduleRoutingTableCalculation();
akmhoque53353462014-04-22 08:43:45 -0500865 }
866 }
867}
868
Nick G97e34942016-07-11 14:46:27 -0500869 // This function determines whether an adj. LSA should be refreshed
870 // or expired. The conditions for getting refreshed are: it is still
871 // in the LSDB, it hasn't been updated by something else already (as
872 // evidenced by its seq. no.), and this is the originating router for
873 // the LSA. It is let expire in all other cases.
874 // lsaKey is the key of the LSA's publishing router.
875 // seqNo is the seq. no. of the candidate LSA.
akmhoque53353462014-04-22 08:43:45 -0500876void
Ashlesh Gawande90173ad2017-08-09 15:19:50 -0500877Lsdb::expireOrRefreshCoordinateLsa(const ndn::Name& lsaKey,
akmhoqueb6450b12014-04-24 00:01:03 -0500878 uint64_t seqNo)
akmhoque53353462014-04-22 08:43:45 -0500879{
dmcoomes5bcb39e2017-10-31 15:07:55 -0500880 NLSR_LOG_DEBUG("Lsdb::expireOrRefreshCorLsa Called ");
881 NLSR_LOG_DEBUG("LSA Key : " << lsaKey << " Seq No: " << seqNo);
akmhoqueb6450b12014-04-24 00:01:03 -0500882 CoordinateLsa* chkCorLsa = findCoordinateLsa(lsaKey);
Nick G97e34942016-07-11 14:46:27 -0500883 // Whether the LSA is in the LSDB or not.
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400884 if (chkCorLsa != nullptr) {
dmcoomes5bcb39e2017-10-31 15:07:55 -0500885 NLSR_LOG_DEBUG("LSA Exists with seq no: " << chkCorLsa->getLsSeqNo());
Nick G97e34942016-07-11 14:46:27 -0500886 // Whether the LSA has been updated without our knowledge.
akmhoque157b0a42014-05-13 00:26:37 -0500887 if (chkCorLsa->getLsSeqNo() == seqNo) {
888 if (chkCorLsa->getOrigRouter() == m_thisRouterPrefix) {
dmcoomes5bcb39e2017-10-31 15:07:55 -0500889 NLSR_LOG_DEBUG("Own Cor LSA, so refreshing it");
890 NLSR_LOG_DEBUG("Deleting Coordinate Lsa");
akmhoque2f423352014-06-03 11:49:35 -0500891 chkCorLsa->writeLog();
akmhoqueb6450b12014-04-24 00:01:03 -0500892 chkCorLsa->setLsSeqNo(chkCorLsa->getLsSeqNo() + 1);
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600893 if (m_confParam.getHyperbolicState() != HYPERBOLIC_STATE_OFF) {
Ashlesh Gawande3e105a02017-05-16 17:36:56 -0500894 m_sequencingManager.setCorLsaSeq(chkCorLsa->getLsSeqNo());
Nick Gordon5c467f02016-07-13 13:40:10 -0500895 }
896
akmhoquec7a79b22014-05-26 08:06:19 -0500897 chkCorLsa->setExpirationTimePoint(getLsaExpirationTimePoint());
dmcoomes5bcb39e2017-10-31 15:07:55 -0500898 NLSR_LOG_DEBUG("Adding Coordinate Lsa");
akmhoque2f423352014-06-03 11:49:35 -0500899 chkCorLsa->writeLog();
akmhoquefdbddb12014-05-02 18:35:19 -0500900 // schedule refreshing event again
akmhoque31d1d4b2014-05-05 22:08:14 -0500901 chkCorLsa->setExpiringEventId(scheduleCoordinateLsaExpiration(
902 chkCorLsa->getKey(),
903 chkCorLsa->getLsSeqNo(),
Alexander Afanasyev8388ec62014-08-16 18:38:57 -0700904 m_lsaRefreshTime));
Nick Gordon5c467f02016-07-13 13:40:10 -0500905 // Only sync coordinate LSAs if link-state routing is disabled
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600906 if (m_confParam.getHyperbolicState() != HYPERBOLIC_STATE_OFF) {
Ashlesh Gawande3e105a02017-05-16 17:36:56 -0500907 m_sequencingManager.writeSeqNoToFile();
Nick Gordon727d4832017-10-13 18:04:25 -0500908 m_sync.publishRoutingUpdate(Lsa::Type::COORDINATE, m_sequencingManager.getCorLsaSeq());
Nick Gordon5c467f02016-07-13 13:40:10 -0500909 }
akmhoque53353462014-04-22 08:43:45 -0500910 }
Nick G97e34942016-07-11 14:46:27 -0500911 // We can't refresh other router's LSAs, so we remove it.
akmhoque157b0a42014-05-13 00:26:37 -0500912 else {
dmcoomes5bcb39e2017-10-31 15:07:55 -0500913 NLSR_LOG_DEBUG("Other's Cor LSA, so removing from LSDB");
akmhoque31d1d4b2014-05-05 22:08:14 -0500914 removeCoordinateLsa(lsaKey);
akmhoque53353462014-04-22 08:43:45 -0500915 }
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600916 if (m_confParam.getHyperbolicState() == HYPERBOLIC_STATE_ON) {
917 m_routingTable.scheduleRoutingTableCalculation();
akmhoque53353462014-04-22 08:43:45 -0500918 }
919 }
920 }
921}
922
akmhoque53353462014-04-22 08:43:45 -0500923void
Alexander Afanasyev411ee4b2014-08-16 23:17:03 -0700924Lsdb::expressInterest(const ndn::Name& interestName, uint32_t timeoutCount,
Nick Gordone98480b2017-05-24 11:23:03 -0500925 ndn::time::steady_clock::TimePoint deadline)
akmhoque31d1d4b2014-05-05 22:08:14 -0500926{
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -0600927 // increment SENT_LSA_INTEREST
928 lsaIncrementSignal(Statistics::PacketType::SENT_LSA_INTEREST);
929
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500930 if (deadline == DEFAULT_LSA_RETRIEVAL_DEADLINE) {
Nick Gordone98480b2017-05-24 11:23:03 -0500931 deadline = ndn::time::steady_clock::now() + ndn::time::seconds(static_cast<int>(LSA_REFRESH_TIME_MAX));
Alexander Afanasyev411ee4b2014-08-16 23:17:03 -0700932 }
Nick G97e34942016-07-11 14:46:27 -0500933 // The first component of the interest is the name.
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500934 ndn::Name lsaName = interestName.getSubName(0, interestName.size()-1);
Nick G97e34942016-07-11 14:46:27 -0500935 // The seq no is the last
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500936 uint64_t seqNo = interestName[-1].toNumber();
937
Nick G97e34942016-07-11 14:46:27 -0500938 // If the LSA is not found in the list currently.
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500939 if (m_highestSeqNo.find(lsaName) == m_highestSeqNo.end()) {
940 m_highestSeqNo[lsaName] = seqNo;
941 }
Nick G97e34942016-07-11 14:46:27 -0500942 // If the new seq no is higher, that means the LSA is valid
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500943 else if (seqNo > m_highestSeqNo[lsaName]) {
944 m_highestSeqNo[lsaName] = seqNo;
945 }
Nick G97e34942016-07-11 14:46:27 -0500946 // Otherwise, its an old/invalid LSA
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500947 else if (seqNo < m_highestSeqNo[lsaName]) {
948 return;
949 }
950
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -0500951 ndn::Interest interest(interestName);
Ashlesh Gawande744e4812018-08-22 16:26:24 -0500952 ndn::util::SegmentFetcher::Options options;
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600953 options.interestLifetime = m_confParam.getLsaInterestLifetime();
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500954
dmcoomes5bcb39e2017-10-31 15:07:55 -0500955 NLSR_LOG_DEBUG("Fetching Data for LSA: " << interestName << " Seq number: " << seqNo);
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600956 auto fetcher = ndn::util::SegmentFetcher::start(m_face, interest,
957 m_confParam.getValidator(), options);
Ashlesh Gawande05cb7282018-08-30 14:39:41 -0500958
Ashlesh Gawande744e4812018-08-22 16:26:24 -0500959 auto it = m_fetchers.insert(fetcher).first;
960
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600961 fetcher->afterSegmentValidated.connect([this] (const ndn::Data& data) {
Ashlesh Gawande15052402018-12-12 20:20:00 -0600962 // Nlsr class subscribes to this to fetch certificates
963 afterSegmentValidatedSignal(data);
964
965 // If we don't do this IMS throws: std::bad_weak_ptr: bad_weak_ptr
966 auto lsaSegment = std::make_shared<const ndn::Data>(data);
967 m_lsaStorage.insert(*lsaSegment);
968 const ndn::Name& segmentName = lsaSegment->getName();
969 // Schedule deletion of the segment
970 m_scheduler.schedule(ndn::time::seconds(LSA_REFRESH_TIME_DEFAULT),
971 [this, segmentName] { m_lsaStorage.erase(segmentName); });
972 });
973
974 fetcher->onComplete.connect([=] (const ndn::ConstBufferPtr& bufferPtr) {
975 m_lsaStorage.erase(ndn::Name(lsaName).appendNumber(seqNo - 1));
976 afterFetchLsa(bufferPtr, interestName);
977 m_fetchers.erase(it);
978 });
979
980 fetcher->onError.connect([=] (uint32_t errorCode, const std::string& msg) {
981 onFetchLsaError(errorCode, msg, interestName, timeoutCount, deadline, lsaName, seqNo);
982 m_fetchers.erase(it);
983 });
Muktadir Chowdhuryc3ea26f2018-01-05 21:40:59 +0000984
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -0600985 // increment a specific SENT_LSA_INTEREST
Nick Gordon727d4832017-10-13 18:04:25 -0500986 Lsa::Type lsaType;
987 std::istringstream(interestName[-2].toUri()) >> lsaType;
988 switch (lsaType) {
989 case Lsa::Type::ADJACENCY:
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -0600990 lsaIncrementSignal(Statistics::PacketType::SENT_ADJ_LSA_INTEREST);
Nick Gordon727d4832017-10-13 18:04:25 -0500991 break;
992 case Lsa::Type::COORDINATE:
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -0600993 lsaIncrementSignal(Statistics::PacketType::SENT_COORD_LSA_INTEREST);
Nick Gordon727d4832017-10-13 18:04:25 -0500994 break;
995 case Lsa::Type::NAME:
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -0600996 lsaIncrementSignal(Statistics::PacketType::SENT_NAME_LSA_INTEREST);
Nick Gordon727d4832017-10-13 18:04:25 -0500997 break;
998 default:
dmcoomes5bcb39e2017-10-31 15:07:55 -0500999 NLSR_LOG_ERROR("lsaType " << lsaType << " not recognized; failed Statistics::PacketType conversion");
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -06001000 }
akmhoque31d1d4b2014-05-05 22:08:14 -05001001}
1002
1003void
1004Lsdb::processInterest(const ndn::Name& name, const ndn::Interest& interest)
1005{
Ashlesh Gawande939b6f82018-12-09 16:51:09 -06001006 ndn::Name interestName(interest.getName());
1007 NLSR_LOG_DEBUG("Interest received for LSA: " << interestName);
1008
1009 if (interestName[-2].isVersion()) {
1010 // Interest for particular segment
1011 if (m_segmentPublisher.replyFromStore(interestName)) {
1012 NLSR_LOG_TRACE("Reply from SegmentPublisher storage");
1013 return;
1014 }
1015 // Remove version and segment
1016 interestName = interestName.getSubName(0, interestName.size() - 2);
1017 NLSR_LOG_TRACE("Interest w/o segment and version: " << interestName);
1018 }
1019
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -06001020 // increment RCV_LSA_INTEREST
1021 lsaIncrementSignal(Statistics::PacketType::RCV_LSA_INTEREST);
1022
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -05001023 std::string chkString("LSA");
Ashlesh Gawande939b6f82018-12-09 16:51:09 -06001024 int32_t lsaPosition = util::getNameComponentPosition(interestName, chkString);
Ashlesh Gawande5bf83172014-09-19 12:38:17 -05001025
Muktadir Chowdhuryc3ea26f2018-01-05 21:40:59 +00001026 // Forms the name of the router that the Interest packet came from.
Ashlesh Gawande85998a12017-12-07 22:22:13 -06001027 ndn::Name originRouter = m_confParam.getNetwork();
Muktadir Chowdhuryc3ea26f2018-01-05 21:40:59 +00001028 originRouter.append(interestName.getSubName(lsaPosition + 1,
Ashlesh Gawande939b6f82018-12-09 16:51:09 -06001029 interestName.size() - lsaPosition - 3));
Ashlesh Gawande5bf83172014-09-19 12:38:17 -05001030
Muktadir Chowdhuryc3ea26f2018-01-05 21:40:59 +00001031 // if the interest is for this router's LSA
Ashlesh Gawande85998a12017-12-07 22:22:13 -06001032 if (originRouter == m_confParam.getRouterPrefix() && lsaPosition >= 0) {
Ashlesh Gawande939b6f82018-12-09 16:51:09 -06001033 uint64_t seqNo = interestName[-1].toNumber();
1034 NLSR_LOG_DEBUG("LSA sequence number from interest: " << seqNo);
Ashlesh Gawande5bf83172014-09-19 12:38:17 -05001035
Ashlesh Gawande939b6f82018-12-09 16:51:09 -06001036 std::string lsaType = interestName[-2].toUri();
1037 Lsa::Type interestedLsType;
1038 std::istringstream(lsaType) >> interestedLsType;
Ashlesh Gawande5bf83172014-09-19 12:38:17 -05001039
Ashlesh Gawande939b6f82018-12-09 16:51:09 -06001040 if (interestedLsType == Lsa::Type::NAME) {
1041 processInterestForNameLsa(interest, originRouter.append(lsaType), seqNo);
akmhoque31d1d4b2014-05-05 22:08:14 -05001042 }
Ashlesh Gawande939b6f82018-12-09 16:51:09 -06001043 else if (interestedLsType == Lsa::Type::ADJACENCY) {
1044 processInterestForAdjacencyLsa(interest, originRouter.append(lsaType), seqNo);
1045 }
1046 else if (interestedLsType == Lsa::Type::COORDINATE) {
1047 processInterestForCoordinateLsa(interest, originRouter.append(lsaType), seqNo);
1048 }
1049 else {
1050 NLSR_LOG_WARN("Received unrecognized LSA type: " << interestedLsType);
1051 }
1052 lsaIncrementSignal(Statistics::PacketType::SENT_LSA_DATA);
Muktadir Chowdhuryc3ea26f2018-01-05 21:40:59 +00001053 }
1054 else { // else the interest is for other router's lsa, serve from LsaSegmentStorage
Ashlesh Gawande15052402018-12-12 20:20:00 -06001055 std::shared_ptr<const ndn::Data> lsaSegment = m_lsaStorage.find(interest);
1056 if (lsaSegment) {
Muktadir Chowdhuryc3ea26f2018-01-05 21:40:59 +00001057 NLSR_LOG_TRACE("Found data in lsa storage. Sending the data for " << interest.getName());
Ashlesh Gawande85998a12017-12-07 22:22:13 -06001058 m_face.put(*lsaSegment);
akmhoque31d1d4b2014-05-05 22:08:14 -05001059 }
akmhoque157b0a42014-05-13 00:26:37 -05001060 else {
Ashlesh Gawande939b6f82018-12-09 16:51:09 -06001061 NLSR_LOG_TRACE(interest << " was not found in this lsa storage.");
akmhoque31d1d4b2014-05-05 22:08:14 -05001062 }
1063 }
1064}
1065
Nick G97e34942016-07-11 14:46:27 -05001066 // \brief Finds and sends a requested name LSA.
1067 // \param interest The interest that seeks the name LSA.
1068 // \param lsaKey The LSA that the Interest is seeking.
1069 // \param seqNo A sequence number to ensure that we are sending the
1070 // version that was requested.
akmhoque69c9aa92014-07-23 15:15:05 -05001071void
akmhoque31d1d4b2014-05-05 22:08:14 -05001072Lsdb::processInterestForNameLsa(const ndn::Interest& interest,
1073 const ndn::Name& lsaKey,
Ashlesh Gawande5bf83172014-09-19 12:38:17 -05001074 uint64_t seqNo)
akmhoque31d1d4b2014-05-05 22:08:14 -05001075{
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -06001076 // increment RCV_NAME_LSA_INTEREST
1077 lsaIncrementSignal(Statistics::PacketType::RCV_NAME_LSA_INTEREST);
dmcoomes5bcb39e2017-10-31 15:07:55 -05001078 NLSR_LOG_DEBUG("nameLsa interest " << interest << " received");
Ashlesh Gawande85998a12017-12-07 22:22:13 -06001079 NameLsa* nameLsa = findNameLsa(lsaKey);
dmcoomescf8d0ed2017-02-21 11:39:01 -06001080 if (nameLsa != nullptr) {
1081 NLSR_LOG_TRACE("Verifying SeqNo for NameLsa is same as requested.");
Ashlesh Gawande5bf83172014-09-19 12:38:17 -05001082 if (nameLsa->getLsSeqNo() == seqNo) {
Nick Gordonfaf49f42017-10-23 12:36:28 -05001083 std::string content = nameLsa->serialize();
Ashlesh Gawande939b6f82018-12-09 16:51:09 -06001084 m_segmentPublisher.publish(interest.getName(), interest.getName(),
1085 ndn::encoding::makeStringBlock(ndn::tlv::Content, content),
Ashlesh Gawande85998a12017-12-07 22:22:13 -06001086 m_lsaRefreshTime, m_signingInfo);
Muktadir Chowdhuryc3ea26f2018-01-05 21:40:59 +00001087
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -06001088 lsaIncrementSignal(Statistics::PacketType::SENT_NAME_LSA_DATA);
akmhoque31d1d4b2014-05-05 22:08:14 -05001089 }
dmcoomes9eaf3f42017-02-21 11:39:01 -06001090 else {
dmcoomes5bcb39e2017-10-31 15:07:55 -05001091 NLSR_LOG_TRACE("SeqNo for nameLsa does not match");
dmcoomes9eaf3f42017-02-21 11:39:01 -06001092 }
1093 }
1094 else {
dmcoomes5bcb39e2017-10-31 15:07:55 -05001095 NLSR_LOG_TRACE(interest << " was not found in this lsdb");
akmhoque31d1d4b2014-05-05 22:08:14 -05001096 }
1097}
1098
Nick G97e34942016-07-11 14:46:27 -05001099 // \brief Finds and sends a requested adj. LSA.
1100 // \param interest The interest that seeks the adj. LSA.
1101 // \param lsaKey The LSA that the Interest is seeking.
1102 // \param seqNo A sequence number to ensure that we are sending the
1103 // version that was requested.
akmhoque31d1d4b2014-05-05 22:08:14 -05001104void
1105Lsdb::processInterestForAdjacencyLsa(const ndn::Interest& interest,
1106 const ndn::Name& lsaKey,
Ashlesh Gawande5bf83172014-09-19 12:38:17 -05001107 uint64_t seqNo)
akmhoque31d1d4b2014-05-05 22:08:14 -05001108{
Ashlesh Gawande85998a12017-12-07 22:22:13 -06001109 if (m_confParam.getHyperbolicState() == HYPERBOLIC_STATE_ON) {
dmcoomes5bcb39e2017-10-31 15:07:55 -05001110 NLSR_LOG_ERROR("Received interest for an adjacency LSA when hyperbolic routing is enabled");
Nick Gordon5c467f02016-07-13 13:40:10 -05001111 }
1112
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -06001113 lsaIncrementSignal(Statistics::PacketType::RCV_ADJ_LSA_INTEREST);
dmcoomes5bcb39e2017-10-31 15:07:55 -05001114 NLSR_LOG_DEBUG("AdjLsa interest " << interest << " received");
Ashlesh Gawande85998a12017-12-07 22:22:13 -06001115 AdjLsa* adjLsa = findAdjLsa(lsaKey);
dmcoomescf8d0ed2017-02-21 11:39:01 -06001116 if (adjLsa != nullptr) {
1117 NLSR_LOG_TRACE("Verifying SeqNo for AdjLsa is same as requested.");
Ashlesh Gawande5bf83172014-09-19 12:38:17 -05001118 if (adjLsa->getLsSeqNo() == seqNo) {
Nick Gordonfaf49f42017-10-23 12:36:28 -05001119 std::string content = adjLsa->serialize();
Ashlesh Gawande939b6f82018-12-09 16:51:09 -06001120 m_segmentPublisher.publish(interest.getName(), interest.getName(),
1121 ndn::encoding::makeStringBlock(ndn::tlv::Content, content),
Ashlesh Gawande85998a12017-12-07 22:22:13 -06001122 m_lsaRefreshTime, m_signingInfo);
Ashlesh Gawande939b6f82018-12-09 16:51:09 -06001123
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -06001124 lsaIncrementSignal(Statistics::PacketType::SENT_ADJ_LSA_DATA);
akmhoque31d1d4b2014-05-05 22:08:14 -05001125 }
dmcoomes9eaf3f42017-02-21 11:39:01 -06001126 else {
dmcoomes5bcb39e2017-10-31 15:07:55 -05001127 NLSR_LOG_TRACE("SeqNo for AdjLsa does not match");
dmcoomes9eaf3f42017-02-21 11:39:01 -06001128 }
1129 }
1130 else {
dmcoomes5bcb39e2017-10-31 15:07:55 -05001131 NLSR_LOG_TRACE(interest << " was not found in this lsdb");
akmhoque31d1d4b2014-05-05 22:08:14 -05001132 }
1133}
1134
Nick G97e34942016-07-11 14:46:27 -05001135 // \brief Finds and sends a requested cor. LSA.
1136 // \param interest The interest that seeks the cor. LSA.
1137 // \param lsaKey The LSA that the Interest is seeking.
1138 // \param seqNo A sequence number to ensure that we are sending the
1139 // version that was requested.
akmhoque31d1d4b2014-05-05 22:08:14 -05001140void
1141Lsdb::processInterestForCoordinateLsa(const ndn::Interest& interest,
1142 const ndn::Name& lsaKey,
Ashlesh Gawande5bf83172014-09-19 12:38:17 -05001143 uint64_t seqNo)
akmhoque31d1d4b2014-05-05 22:08:14 -05001144{
Ashlesh Gawande85998a12017-12-07 22:22:13 -06001145 if (m_confParam.getHyperbolicState() == HYPERBOLIC_STATE_OFF) {
dmcoomes5bcb39e2017-10-31 15:07:55 -05001146 NLSR_LOG_ERROR("Received Interest for a coordinate LSA when link-state routing is enabled");
Nick Gordon5c467f02016-07-13 13:40:10 -05001147 }
1148
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -06001149 lsaIncrementSignal(Statistics::PacketType::RCV_COORD_LSA_INTEREST);
dmcoomes5bcb39e2017-10-31 15:07:55 -05001150 NLSR_LOG_DEBUG("CoordinateLsa interest " << interest << " received");
Ashlesh Gawande85998a12017-12-07 22:22:13 -06001151 CoordinateLsa* corLsa = findCoordinateLsa(lsaKey);
dmcoomescf8d0ed2017-02-21 11:39:01 -06001152 if (corLsa != nullptr) {
1153 NLSR_LOG_TRACE("Verifying SeqNo for CoordinateLsa is same as requested.");
Ashlesh Gawande5bf83172014-09-19 12:38:17 -05001154 if (corLsa->getLsSeqNo() == seqNo) {
Nick Gordonfaf49f42017-10-23 12:36:28 -05001155 std::string content = corLsa->serialize();
Ashlesh Gawande939b6f82018-12-09 16:51:09 -06001156 m_segmentPublisher.publish(interest.getName(), interest.getName(),
1157 ndn::encoding::makeStringBlock(ndn::tlv::Content, content),
Ashlesh Gawande85998a12017-12-07 22:22:13 -06001158 m_lsaRefreshTime, m_signingInfo);
Ashlesh Gawande939b6f82018-12-09 16:51:09 -06001159
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -06001160 lsaIncrementSignal(Statistics::PacketType::SENT_COORD_LSA_DATA);
akmhoque31d1d4b2014-05-05 22:08:14 -05001161 }
dmcoomes9eaf3f42017-02-21 11:39:01 -06001162 else {
dmcoomes5bcb39e2017-10-31 15:07:55 -05001163 NLSR_LOG_TRACE("SeqNo for CoordinateLsa does not match");
dmcoomes9eaf3f42017-02-21 11:39:01 -06001164 }
1165 }
1166 else {
dmcoomes5bcb39e2017-10-31 15:07:55 -05001167 NLSR_LOG_TRACE(interest << " was not found in this lsdb");
akmhoque31d1d4b2014-05-05 22:08:14 -05001168 }
1169}
1170
1171void
dmcoomes9f936662017-03-02 10:33:09 -06001172Lsdb::onContentValidated(const std::shared_ptr<const ndn::Data>& data)
Yingdi Yu20e3a6e2014-05-26 23:16:10 -07001173{
1174 const ndn::Name& dataName = data->getName();
dmcoomes5bcb39e2017-10-31 15:07:55 -05001175 NLSR_LOG_DEBUG("Data validation successful for LSA: " << dataName);
Ashlesh Gawande5bf83172014-09-19 12:38:17 -05001176
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -05001177 std::string chkString("LSA");
akmhoque31d1d4b2014-05-05 22:08:14 -05001178 int32_t lsaPosition = util::getNameComponentPosition(dataName, chkString);
Ashlesh Gawande5bf83172014-09-19 12:38:17 -05001179
akmhoque157b0a42014-05-13 00:26:37 -05001180 if (lsaPosition >= 0) {
Ashlesh Gawande5bf83172014-09-19 12:38:17 -05001181
Nick G97e34942016-07-11 14:46:27 -05001182 // Extracts the prefix of the originating router from the data.
Ashlesh Gawande85998a12017-12-07 22:22:13 -06001183 ndn::Name originRouter = m_confParam.getNetwork();
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -05001184 originRouter.append(dataName.getSubName(lsaPosition + 1, dataName.size() - lsaPosition - 3));
Ashlesh Gawande5bf83172014-09-19 12:38:17 -05001185
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -05001186 uint64_t seqNo = dataName[-1].toNumber();
Ashlesh Gawande820bb662017-08-03 16:12:07 -05001187 std::string dataContent(reinterpret_cast<const char*>(data->getContent().value()),
1188 data->getContent().value_size());
Ashlesh Gawande5bf83172014-09-19 12:38:17 -05001189
Nick Gordon727d4832017-10-13 18:04:25 -05001190 Lsa::Type interestedLsType;
1191 std::istringstream(dataName[-2].toUri()) >> interestedLsType;
Ashlesh Gawande5bf83172014-09-19 12:38:17 -05001192
Nick Gordon727d4832017-10-13 18:04:25 -05001193 if (interestedLsType == Lsa::Type::NAME) {
1194 processContentNameLsa(originRouter.append(std::to_string(interestedLsType)), seqNo,
1195 dataContent);
akmhoque31d1d4b2014-05-05 22:08:14 -05001196 }
Nick Gordon727d4832017-10-13 18:04:25 -05001197 else if (interestedLsType == Lsa::Type::ADJACENCY) {
1198 processContentAdjacencyLsa(originRouter.append(std::to_string(interestedLsType)), seqNo,
1199 dataContent);
akmhoque31d1d4b2014-05-05 22:08:14 -05001200 }
Nick Gordon727d4832017-10-13 18:04:25 -05001201 else if (interestedLsType == Lsa::Type::COORDINATE) {
1202 processContentCoordinateLsa(originRouter.append(std::to_string(interestedLsType)), seqNo,
1203 dataContent);
akmhoque31d1d4b2014-05-05 22:08:14 -05001204 }
akmhoque157b0a42014-05-13 00:26:37 -05001205 else {
dmcoomes5bcb39e2017-10-31 15:07:55 -05001206 NLSR_LOG_WARN("Received unrecognized LSA Type: " << interestedLsType);
akmhoque31d1d4b2014-05-05 22:08:14 -05001207 }
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -06001208
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -06001209 lsaIncrementSignal(Statistics::PacketType::RCV_LSA_DATA);
akmhoque31d1d4b2014-05-05 22:08:14 -05001210 }
1211}
1212
1213void
1214Lsdb::processContentNameLsa(const ndn::Name& lsaKey,
Ashlesh Gawande5bf83172014-09-19 12:38:17 -05001215 uint64_t lsSeqNo, std::string& dataContent)
akmhoque31d1d4b2014-05-05 22:08:14 -05001216{
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -06001217 lsaIncrementSignal(Statistics::PacketType::RCV_NAME_LSA_DATA);
akmhoque157b0a42014-05-13 00:26:37 -05001218 if (isNameLsaNew(lsaKey, lsSeqNo)) {
akmhoque31d1d4b2014-05-05 22:08:14 -05001219 NameLsa nameLsa;
Nick Gordon0fa4c772017-10-23 13:33:03 -05001220 if (nameLsa.deserialize(dataContent)) {
akmhoque31d1d4b2014-05-05 22:08:14 -05001221 installNameLsa(nameLsa);
1222 }
akmhoque157b0a42014-05-13 00:26:37 -05001223 else {
dmcoomes5bcb39e2017-10-31 15:07:55 -05001224 NLSR_LOG_DEBUG("LSA data decoding error :(");
akmhoque31d1d4b2014-05-05 22:08:14 -05001225 }
1226 }
1227}
1228
1229void
1230Lsdb::processContentAdjacencyLsa(const ndn::Name& lsaKey,
Ashlesh Gawande5bf83172014-09-19 12:38:17 -05001231 uint64_t lsSeqNo, std::string& dataContent)
akmhoque31d1d4b2014-05-05 22:08:14 -05001232{
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -06001233 lsaIncrementSignal(Statistics::PacketType::RCV_ADJ_LSA_DATA);
akmhoque157b0a42014-05-13 00:26:37 -05001234 if (isAdjLsaNew(lsaKey, lsSeqNo)) {
akmhoque31d1d4b2014-05-05 22:08:14 -05001235 AdjLsa adjLsa;
Nick Gordon0fa4c772017-10-23 13:33:03 -05001236 if (adjLsa.deserialize(dataContent)) {
akmhoque31d1d4b2014-05-05 22:08:14 -05001237 installAdjLsa(adjLsa);
1238 }
akmhoque157b0a42014-05-13 00:26:37 -05001239 else {
dmcoomes5bcb39e2017-10-31 15:07:55 -05001240 NLSR_LOG_DEBUG("LSA data decoding error :(");
akmhoque31d1d4b2014-05-05 22:08:14 -05001241 }
1242 }
1243}
1244
1245void
1246Lsdb::processContentCoordinateLsa(const ndn::Name& lsaKey,
Ashlesh Gawande5bf83172014-09-19 12:38:17 -05001247 uint64_t lsSeqNo, std::string& dataContent)
akmhoque31d1d4b2014-05-05 22:08:14 -05001248{
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -06001249 lsaIncrementSignal(Statistics::PacketType::RCV_COORD_LSA_DATA);
akmhoque157b0a42014-05-13 00:26:37 -05001250 if (isCoordinateLsaNew(lsaKey, lsSeqNo)) {
akmhoque31d1d4b2014-05-05 22:08:14 -05001251 CoordinateLsa corLsa;
Nick Gordon0fa4c772017-10-23 13:33:03 -05001252 if (corLsa.deserialize(dataContent)) {
akmhoque31d1d4b2014-05-05 22:08:14 -05001253 installCoordinateLsa(corLsa);
1254 }
akmhoque157b0a42014-05-13 00:26:37 -05001255 else {
dmcoomes5bcb39e2017-10-31 15:07:55 -05001256 NLSR_LOG_DEBUG("LSA data decoding error :(");
akmhoque31d1d4b2014-05-05 22:08:14 -05001257 }
1258 }
1259}
1260
akmhoquec7a79b22014-05-26 08:06:19 -05001261ndn::time::system_clock::TimePoint
1262Lsdb::getLsaExpirationTimePoint()
1263{
1264 ndn::time::system_clock::TimePoint expirationTimePoint = ndn::time::system_clock::now();
1265 expirationTimePoint = expirationTimePoint +
Ashlesh Gawande85998a12017-12-07 22:22:13 -06001266 ndn::time::seconds(m_confParam.getRouterDeadInterval());
akmhoquec7a79b22014-05-26 08:06:19 -05001267 return expirationTimePoint;
1268}
akmhoque31d1d4b2014-05-05 22:08:14 -05001269
1270void
akmhoque2f423352014-06-03 11:49:35 -05001271Lsdb::writeAdjLsdbLog()
akmhoque53353462014-04-22 08:43:45 -05001272{
Ashlesh Gawande6b388fc2019-09-30 10:14:41 -05001273 if (m_confParam.getHyperbolicState() == HYPERBOLIC_STATE_ON) {
1274 return;
1275 }
1276
dmcoomes5bcb39e2017-10-31 15:07:55 -05001277 NLSR_LOG_DEBUG("---------------Adj LSDB-------------------");
Ashlesh Gawandee8d8bd52018-08-09 17:18:51 -05001278 for (const auto& adj : m_adjLsdb) {
1279 adj.writeLog();
akmhoque53353462014-04-22 08:43:45 -05001280 }
1281}
1282
1283//-----utility function -----
1284bool
Nick Gordon727d4832017-10-13 18:04:25 -05001285Lsdb::doesLsaExist(const ndn::Name& key, const Lsa::Type& lsType)
akmhoque53353462014-04-22 08:43:45 -05001286{
Nick Gordon727d4832017-10-13 18:04:25 -05001287 switch (lsType) {
1288 case Lsa::Type::ADJACENCY:
akmhoque53353462014-04-22 08:43:45 -05001289 return doesAdjLsaExist(key);
Nick Gordon727d4832017-10-13 18:04:25 -05001290 case Lsa::Type::COORDINATE:
akmhoqueb6450b12014-04-24 00:01:03 -05001291 return doesCoordinateLsaExist(key);
Nick Gordon727d4832017-10-13 18:04:25 -05001292 case Lsa::Type::NAME:
1293 return doesNameLsaExist(key);
1294 default:
1295 return false;
akmhoque53353462014-04-22 08:43:45 -05001296 }
akmhoque53353462014-04-22 08:43:45 -05001297}
1298
Nick Gordon8f23b5d2017-08-31 17:53:07 -05001299bool
Nick Gordon727d4832017-10-13 18:04:25 -05001300Lsdb::isLsaNew(const ndn::Name& routerName, const Lsa::Type& lsaType,
Nick Gordon8f23b5d2017-08-31 17:53:07 -05001301 const uint64_t& sequenceNumber) {
1302 ndn::Name lsaKey = routerName;
Nick Gordon727d4832017-10-13 18:04:25 -05001303 lsaKey.append(std::to_string(lsaType));
Nick Gordon8f23b5d2017-08-31 17:53:07 -05001304
Nick Gordon727d4832017-10-13 18:04:25 -05001305 switch (lsaType) {
1306 case Lsa::Type::ADJACENCY:
Nick Gordon8f23b5d2017-08-31 17:53:07 -05001307 return isAdjLsaNew(lsaKey, sequenceNumber);
Nick Gordon727d4832017-10-13 18:04:25 -05001308 case Lsa::Type::COORDINATE:
Nick Gordon8f23b5d2017-08-31 17:53:07 -05001309 return isCoordinateLsaNew(lsaKey, sequenceNumber);
Nick Gordon727d4832017-10-13 18:04:25 -05001310 case Lsa::Type::NAME:
1311 return isNameLsaNew(lsaKey, sequenceNumber);
1312 default:
Nick Gordon8f23b5d2017-08-31 17:53:07 -05001313 return false;
1314 }
1315}
1316
Alexander Afanasyev8388ec62014-08-16 18:38:57 -07001317} // namespace nlsr