blob: 4159c4f6e00d1e4a8f9e68c35f33a1c4bde6296a [file] [log] [blame]
akmhoque3d06e792014-05-27 16:23:20 -05001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
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 Chowdhuryc3ea26f2018-01-05 21:40:59 +000025#include "lsa-segment-storage.hpp"
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -050026#include "nlsr.hpp"
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -050027#include "utility/name-helper.hpp"
28
29#include <ndn-cxx/security/signing-helpers.hpp>
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -050030
akmhoque53353462014-04-22 08:43:45 -050031namespace nlsr {
32
dmcoomescf8d0ed2017-02-21 11:39:01 -060033INIT_LOGGER(Lsdb);
akmhoque674b0b12014-05-20 14:33:28 -050034
Jiewen Tana0497d82015-02-02 21:59:18 -080035const ndn::Name::Component Lsdb::NAME_COMPONENT = ndn::Name::Component("lsdb");
Vince Lehman18841082014-08-19 17:15:24 -050036const ndn::time::seconds Lsdb::GRACE_PERIOD = ndn::time::seconds(10);
Nick Gordone98480b2017-05-24 11:23:03 -050037const ndn::time::steady_clock::TimePoint Lsdb::DEFAULT_LSA_RETRIEVAL_DEADLINE =
38 ndn::time::steady_clock::TimePoint::min();
Vince Lehman18841082014-08-19 17:15:24 -050039
Ashlesh Gawande85998a12017-12-07 22:22:13 -060040Lsdb::Lsdb(ndn::Face& face, ndn::KeyChain& keyChain,
41 ndn::security::SigningInfo& signingInfo, ConfParameter& confParam,
42 NamePrefixTable& namePrefixTable, RoutingTable& routingTable)
43 : m_face(face)
44 , m_scheduler(face.getIoService())
45 , m_signingInfo(signingInfo)
46 , m_confParam(confParam)
47 , m_namePrefixTable(namePrefixTable)
48 , m_routingTable(routingTable)
49 , m_sync(m_face,
Nick Gordon727d4832017-10-13 18:04:25 -050050 [this] (const ndn::Name& routerName, const Lsa::Type& lsaType,
Nick Gordon9eac4d92017-08-29 17:31:29 -050051 const uint64_t& sequenceNumber) {
Nick Gordon8f23b5d2017-08-31 17:53:07 -050052 return isLsaNew(routerName, lsaType, sequenceNumber);
Ashlesh Gawande85998a12017-12-07 22:22:13 -060053 }, m_confParam)
54 , m_lsaStorage(m_scheduler)
55 , m_lsaRefreshTime(ndn::time::seconds(m_confParam.getLsaRefreshTime()))
56 , m_thisRouterPrefix(m_confParam.getRouterPrefix().toUri())
57 , m_adjLsaBuildInterval(m_confParam.getAdjLsaBuildInterval())
dulalsaurab82a34c22019-02-04 17:31:21 +000058 , m_sequencingManager(m_confParam.getStateFileDir(), m_confParam.getHyperbolicState())
Nick Gordon9eac4d92017-08-29 17:31:29 -050059 , m_onNewLsaConnection(m_sync.onNewLsa->connect(
Ashlesh Gawande939b6f82018-12-09 16:51:09 -060060 [this] (const ndn::Name& updateName, uint64_t sequenceNumber) {
Nick Gordon9eac4d92017-08-29 17:31:29 -050061 ndn::Name lsaInterest{updateName};
62 lsaInterest.appendNumber(sequenceNumber);
63 expressInterest(lsaInterest, 0);
64 }))
Ashlesh Gawande85998a12017-12-07 22:22:13 -060065 , m_segmentPublisher(m_face, keyChain)
66 , m_isBuildAdjLsaSheduled(false)
67 , m_adjBuildCount(0)
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -050068{
69}
70
Ashlesh Gawande744e4812018-08-22 16:26:24 -050071Lsdb::~Lsdb()
72{
73 for (const auto& sp : m_fetchers) {
74 sp->stop();
75 }
76}
77
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -050078void
79Lsdb::onFetchLsaError(uint32_t errorCode,
80 const std::string& msg,
Ashlesh Gawande744e4812018-08-22 16:26:24 -050081 const ndn::Name& interestName,
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -050082 uint32_t retransmitNo,
83 const ndn::time::steady_clock::TimePoint& deadline,
84 ndn::Name lsaName,
85 uint64_t seqNo)
86{
dmcoomes5bcb39e2017-10-31 15:07:55 -050087 NLSR_LOG_DEBUG("Failed to fetch LSA: " << lsaName << ", Error code: " << errorCode
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -050088 << ", Message: " << msg);
89
90 if (ndn::time::steady_clock::now() < deadline) {
91 SequenceNumberMap::const_iterator it = m_highestSeqNo.find(lsaName);
92
93 if (it != m_highestSeqNo.end() && it->second == seqNo) {
94 // If the SegmentFetcher failed due to an Interest timeout, it is safe to re-express
95 // immediately since at the least the LSA Interest lifetime has elapsed.
96 // Otherwise, it is necessary to delay the Interest re-expression to prevent
97 // the potential for constant Interest flooding.
Ashlesh Gawande85998a12017-12-07 22:22:13 -060098 ndn::time::seconds delay = m_confParam.getLsaInterestLifetime();
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -050099
100 if (errorCode == ndn::util::SegmentFetcher::ErrorCode::INTEREST_TIMEOUT) {
101 delay = ndn::time::seconds(0);
102 }
103
104 m_scheduler.scheduleEvent(delay, std::bind(&Lsdb::expressInterest, this,
105 interestName, retransmitNo + 1, deadline));
106 }
107 }
108}
109
110void
Ashlesh Gawande744e4812018-08-22 16:26:24 -0500111Lsdb::afterFetchLsa(const ndn::ConstBufferPtr& bufferPtr, const ndn::Name& interestName)
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -0500112{
dmcoomes9f936662017-03-02 10:33:09 -0600113 std::shared_ptr<ndn::Data> data = std::make_shared<ndn::Data>(ndn::Name(interestName));
Ashlesh Gawande939b6f82018-12-09 16:51:09 -0600114 data->setContent(ndn::Block(bufferPtr));
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -0500115
dmcoomes5bcb39e2017-10-31 15:07:55 -0500116 NLSR_LOG_DEBUG("Received data for LSA(name): " << data->getName());
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -0500117
118 ndn::Name lsaName = interestName.getSubName(0, interestName.size()-1);
119 uint64_t seqNo = interestName[-1].toNumber();
120
121 if (m_highestSeqNo.find(lsaName) == m_highestSeqNo.end()) {
122 m_highestSeqNo[lsaName] = seqNo;
123 }
124 else if (seqNo > m_highestSeqNo[lsaName]) {
125 m_highestSeqNo[lsaName] = seqNo;
dmcoomes5bcb39e2017-10-31 15:07:55 -0500126 NLSR_LOG_TRACE("SeqNo for LSA(name): " << data->getName() << " updated");
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -0500127 }
128 else if (seqNo < m_highestSeqNo[lsaName]) {
129 return;
130 }
131
132 onContentValidated(data);
133}
akmhoque53353462014-04-22 08:43:45 -0500134
135void
akmhoque31d1d4b2014-05-05 22:08:14 -0500136Lsdb::cancelScheduleLsaExpiringEvent(ndn::EventId eid)
akmhoque53353462014-04-22 08:43:45 -0500137{
Vince Lehman7c603292014-09-11 17:48:16 -0500138 m_scheduler.cancelEvent(eid);
akmhoque53353462014-04-22 08:43:45 -0500139}
140
Nick G97e34942016-07-11 14:46:27 -0500141 /*! \brief Compares if a name LSA is the same as the one specified by key
142
143 \param nlsa1 A name LSA object
144 \param key A key of an originating router to compare to nlsa1
145 */
akmhoque53353462014-04-22 08:43:45 -0500146static bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500147nameLsaCompareByKey(const NameLsa& nlsa1, const ndn::Name& key)
akmhoque53353462014-04-22 08:43:45 -0500148{
149 return nlsa1.getKey() == key;
150}
151
akmhoque53353462014-04-22 08:43:45 -0500152bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500153Lsdb::buildAndInstallOwnNameLsa()
akmhoque53353462014-04-22 08:43:45 -0500154{
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600155 NameLsa nameLsa(m_confParam.getRouterPrefix(),
Ashlesh Gawande3e105a02017-05-16 17:36:56 -0500156 m_sequencingManager.getNameLsaSeq() + 1,
akmhoquec7a79b22014-05-26 08:06:19 -0500157 getLsaExpirationTimePoint(),
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600158 m_confParam.getNamePrefixList());
Ashlesh Gawande3e105a02017-05-16 17:36:56 -0500159 m_sequencingManager.increaseNameLsaSeq();
160
161 m_sequencingManager.writeSeqNoToFile();
Nick Gordon727d4832017-10-13 18:04:25 -0500162 m_sync.publishRoutingUpdate(Lsa::Type::NAME, m_sequencingManager.getNameLsaSeq());
Ashlesh Gawande3e105a02017-05-16 17:36:56 -0500163
akmhoque31d1d4b2014-05-05 22:08:14 -0500164 return installNameLsa(nameLsa);
akmhoque53353462014-04-22 08:43:45 -0500165}
166
akmhoqueb6450b12014-04-24 00:01:03 -0500167NameLsa*
akmhoque31d1d4b2014-05-05 22:08:14 -0500168Lsdb::findNameLsa(const ndn::Name& key)
akmhoque53353462014-04-22 08:43:45 -0500169{
170 std::list<NameLsa>::iterator it = std::find_if(m_nameLsdb.begin(),
171 m_nameLsdb.end(),
dmcoomes9f936662017-03-02 10:33:09 -0600172 std::bind(nameLsaCompareByKey, _1, key));
akmhoque157b0a42014-05-13 00:26:37 -0500173 if (it != m_nameLsdb.end()) {
akmhoqueb6450b12014-04-24 00:01:03 -0500174 return &(*it);
akmhoque53353462014-04-22 08:43:45 -0500175 }
akmhoqueb6450b12014-04-24 00:01:03 -0500176 return 0;
akmhoque53353462014-04-22 08:43:45 -0500177}
178
179bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500180Lsdb::isNameLsaNew(const ndn::Name& key, uint64_t seqNo)
akmhoque53353462014-04-22 08:43:45 -0500181{
akmhoqueb6450b12014-04-24 00:01:03 -0500182 NameLsa* nameLsaCheck = findNameLsa(key);
Nick G97e34942016-07-11 14:46:27 -0500183 // Is the name in the LSDB
akmhoque157b0a42014-05-13 00:26:37 -0500184 if (nameLsaCheck != 0) {
Nick G97e34942016-07-11 14:46:27 -0500185 // And the supplied seq no is the highest so far
akmhoque157b0a42014-05-13 00:26:37 -0500186 if (nameLsaCheck->getLsSeqNo() < seqNo) {
akmhoque53353462014-04-22 08:43:45 -0500187 return true;
188 }
akmhoque157b0a42014-05-13 00:26:37 -0500189 else {
akmhoque53353462014-04-22 08:43:45 -0500190 return false;
191 }
192 }
193 return true;
194}
195
196ndn::EventId
akmhoquec7a79b22014-05-26 08:06:19 -0500197Lsdb::scheduleNameLsaExpiration(const ndn::Name& key, int seqNo,
198 const ndn::time::seconds& expTime)
akmhoque53353462014-04-22 08:43:45 -0500199{
Vince Lehman7c603292014-09-11 17:48:16 -0500200 return m_scheduler.scheduleEvent(expTime + GRACE_PERIOD,
Ashlesh Gawande90173ad2017-08-09 15:19:50 -0500201 std::bind(&Lsdb::expireOrRefreshNameLsa, this, key, seqNo));
akmhoque53353462014-04-22 08:43:45 -0500202}
203
204bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500205Lsdb::installNameLsa(NameLsa& nlsa)
akmhoque53353462014-04-22 08:43:45 -0500206{
Muktadir Chowdhuryc3ea26f2018-01-05 21:40:59 +0000207 NLSR_LOG_TRACE("installNameLsa");
Alexander Afanasyev8388ec62014-08-16 18:38:57 -0700208 ndn::time::seconds timeToExpire = m_lsaRefreshTime;
akmhoqueb6450b12014-04-24 00:01:03 -0500209 NameLsa* chkNameLsa = findNameLsa(nlsa.getKey());
Nick G97e34942016-07-11 14:46:27 -0500210 // Determines if the name LSA is new or not.
akmhoque157b0a42014-05-13 00:26:37 -0500211 if (chkNameLsa == 0) {
akmhoque53353462014-04-22 08:43:45 -0500212 addNameLsa(nlsa);
dmcoomes5bcb39e2017-10-31 15:07:55 -0500213 NLSR_LOG_DEBUG("New Name LSA");
214 NLSR_LOG_DEBUG("Adding Name Lsa");
akmhoque53353462014-04-22 08:43:45 -0500215 nlsa.writeLog();
akmhoque674b0b12014-05-20 14:33:28 -0500216
Muktadir Chowdhuryc3ea26f2018-01-05 21:40:59 +0000217 NLSR_LOG_TRACE("nlsa.getOrigRouter(): " << nlsa.getOrigRouter());
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600218 NLSR_LOG_TRACE("m_confParam.getRouterPrefix(): " << m_confParam.getRouterPrefix());
Muktadir Chowdhuryc3ea26f2018-01-05 21:40:59 +0000219
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600220 if (nlsa.getOrigRouter() != m_confParam.getRouterPrefix()) {
Nick G97e34942016-07-11 14:46:27 -0500221 // If this name LSA is from another router, add the advertised
222 // prefixes to the NPT.
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600223 m_namePrefixTable.addEntry(nlsa.getOrigRouter(),
akmhoque31d1d4b2014-05-05 22:08:14 -0500224 nlsa.getOrigRouter());
Ashlesh Gawandee8d8bd52018-08-09 17:18:51 -0500225 for (const auto& name : nlsa.getNpl().getNames()) {
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600226 if (name != m_confParam.getRouterPrefix()) {
227 m_namePrefixTable.addEntry(name, nlsa.getOrigRouter());
akmhoque53353462014-04-22 08:43:45 -0500228 }
229 }
230 }
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600231 if (nlsa.getOrigRouter() != m_confParam.getRouterPrefix()) {
akmhoquec7a79b22014-05-26 08:06:19 -0500232 ndn::time::system_clock::Duration duration = nlsa.getExpirationTimePoint() -
233 ndn::time::system_clock::now();
234 timeToExpire = ndn::time::duration_cast<ndn::time::seconds>(duration);
akmhoque53353462014-04-22 08:43:45 -0500235 }
akmhoque31d1d4b2014-05-05 22:08:14 -0500236 nlsa.setExpiringEventId(scheduleNameLsaExpiration(nlsa.getKey(),
akmhoque53353462014-04-22 08:43:45 -0500237 nlsa.getLsSeqNo(),
238 timeToExpire));
239 }
Nick G97e34942016-07-11 14:46:27 -0500240 // Else this is a known name LSA, so we are updating it.
akmhoque157b0a42014-05-13 00:26:37 -0500241 else {
Muktadir Chowdhuryc3ea26f2018-01-05 21:40:59 +0000242 NLSR_LOG_TRACE("Known name lsa");
243 NLSR_LOG_TRACE("chkNameLsa->getLsSeqNo(): " << chkNameLsa->getLsSeqNo());
244 NLSR_LOG_TRACE("nlsa.getLsSeqNo(): " << nlsa.getLsSeqNo());
akmhoque157b0a42014-05-13 00:26:37 -0500245 if (chkNameLsa->getLsSeqNo() < nlsa.getLsSeqNo()) {
dmcoomes5bcb39e2017-10-31 15:07:55 -0500246 NLSR_LOG_DEBUG("Updated Name LSA. Updating LSDB");
247 NLSR_LOG_DEBUG("Deleting Name Lsa");
akmhoqueb6450b12014-04-24 00:01:03 -0500248 chkNameLsa->writeLog();
249 chkNameLsa->setLsSeqNo(nlsa.getLsSeqNo());
akmhoquec7a79b22014-05-26 08:06:19 -0500250 chkNameLsa->setExpirationTimePoint(nlsa.getExpirationTimePoint());
akmhoqueb6450b12014-04-24 00:01:03 -0500251 chkNameLsa->getNpl().sort();
akmhoque53353462014-04-22 08:43:45 -0500252 nlsa.getNpl().sort();
Nick G97e34942016-07-11 14:46:27 -0500253 // Obtain the set difference of the current and the incoming
254 // name prefix sets, and add those.
Nick Gordonf14ec352017-07-24 16:09:58 -0500255 std::list<ndn::Name> newNames = nlsa.getNpl().getNames();
256 std::list<ndn::Name> oldNames = chkNameLsa->getNpl().getNames();
257 std::list<ndn::Name> namesToAdd;
258 std::set_difference(newNames.begin(), newNames.end(), oldNames.begin(), oldNames.end(),
259 std::inserter(namesToAdd, namesToAdd.begin()));
Ashlesh Gawandee8d8bd52018-08-09 17:18:51 -0500260 for (const auto& name : namesToAdd) {
261 chkNameLsa->addName(name);
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600262 if (nlsa.getOrigRouter() != m_confParam.getRouterPrefix()) {
263 if (name != m_confParam.getRouterPrefix()) {
264 m_namePrefixTable.addEntry(name, nlsa.getOrigRouter());
akmhoque53353462014-04-22 08:43:45 -0500265 }
266 }
267 }
Vince Lehmanf1aa5232014-10-06 17:57:35 -0500268
269 chkNameLsa->getNpl().sort();
270
Nick G97e34942016-07-11 14:46:27 -0500271 // Also remove any names that are no longer being advertised.
Nick Gordonf14ec352017-07-24 16:09:58 -0500272 std::list<ndn::Name> namesToRemove;
273 std::set_difference(oldNames.begin(), oldNames.end(), newNames.begin(), newNames.end(),
274 std::inserter(namesToRemove, namesToRemove.begin()));
Ashlesh Gawandee8d8bd52018-08-09 17:18:51 -0500275 for (const auto& name : namesToRemove) {
276 NLSR_LOG_DEBUG("Removing name LSA no longer advertised: " << name);
277 chkNameLsa->removeName(name);
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600278 if (nlsa.getOrigRouter() != m_confParam.getRouterPrefix()) {
279 if (name != m_confParam.getRouterPrefix()) {
280 m_namePrefixTable.removeEntry(name, nlsa.getOrigRouter());
akmhoque53353462014-04-22 08:43:45 -0500281 }
282 }
283 }
dmcoomes9eaf3f42017-02-21 11:39:01 -0600284
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600285 if (nlsa.getOrigRouter() != m_confParam.getRouterPrefix()) {
akmhoquec7a79b22014-05-26 08:06:19 -0500286 ndn::time::system_clock::Duration duration = nlsa.getExpirationTimePoint() -
287 ndn::time::system_clock::now();
288 timeToExpire = ndn::time::duration_cast<ndn::time::seconds>(duration);
akmhoque53353462014-04-22 08:43:45 -0500289 }
akmhoque31d1d4b2014-05-05 22:08:14 -0500290 cancelScheduleLsaExpiringEvent(chkNameLsa->getExpiringEventId());
291 chkNameLsa->setExpiringEventId(scheduleNameLsaExpiration(nlsa.getKey(),
akmhoqueb6450b12014-04-24 00:01:03 -0500292 nlsa.getLsSeqNo(),
293 timeToExpire));
dmcoomes5bcb39e2017-10-31 15:07:55 -0500294 NLSR_LOG_DEBUG("Adding Name Lsa");
akmhoqueb6450b12014-04-24 00:01:03 -0500295 chkNameLsa->writeLog();
akmhoque53353462014-04-22 08:43:45 -0500296 }
297 }
298 return true;
299}
300
301bool
302Lsdb::addNameLsa(NameLsa& nlsa)
303{
304 std::list<NameLsa>::iterator it = std::find_if(m_nameLsdb.begin(),
305 m_nameLsdb.end(),
dmcoomes9f936662017-03-02 10:33:09 -0600306 std::bind(nameLsaCompareByKey, _1,
akmhoque53353462014-04-22 08:43:45 -0500307 nlsa.getKey()));
akmhoque157b0a42014-05-13 00:26:37 -0500308 if (it == m_nameLsdb.end()) {
akmhoque53353462014-04-22 08:43:45 -0500309 m_nameLsdb.push_back(nlsa);
310 return true;
311 }
312 return false;
313}
314
315bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500316Lsdb::removeNameLsa(const ndn::Name& key)
akmhoque53353462014-04-22 08:43:45 -0500317{
318 std::list<NameLsa>::iterator it = std::find_if(m_nameLsdb.begin(),
319 m_nameLsdb.end(),
dmcoomes9f936662017-03-02 10:33:09 -0600320 std::bind(nameLsaCompareByKey, _1, key));
akmhoque157b0a42014-05-13 00:26:37 -0500321 if (it != m_nameLsdb.end()) {
dmcoomes5bcb39e2017-10-31 15:07:55 -0500322 NLSR_LOG_DEBUG("Deleting Name Lsa");
akmhoque53353462014-04-22 08:43:45 -0500323 (*it).writeLog();
Nick G97e34942016-07-11 14:46:27 -0500324 // If the requested name LSA is not ours, we also need to remove
325 // its entries from the NPT.
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600326 if ((*it).getOrigRouter() != m_confParam.getRouterPrefix()) {
327 m_namePrefixTable.removeEntry((*it).getOrigRouter(), (*it).getOrigRouter());
328
Nick Gordonf14ec352017-07-24 16:09:58 -0500329 for (const auto& name : it->getNpl().getNames()) {
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600330 if (name != m_confParam.getRouterPrefix()) {
331 m_namePrefixTable.removeEntry(name, it->getOrigRouter());
akmhoque53353462014-04-22 08:43:45 -0500332 }
333 }
334 }
335 m_nameLsdb.erase(it);
336 return true;
337 }
338 return false;
339}
340
341bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500342Lsdb::doesNameLsaExist(const ndn::Name& key)
akmhoque53353462014-04-22 08:43:45 -0500343{
344 std::list<NameLsa>::iterator it = std::find_if(m_nameLsdb.begin(),
345 m_nameLsdb.end(),
dmcoomes9f936662017-03-02 10:33:09 -0600346 std::bind(nameLsaCompareByKey, _1, key));
akmhoque157b0a42014-05-13 00:26:37 -0500347 if (it == m_nameLsdb.end()) {
akmhoque53353462014-04-22 08:43:45 -0500348 return false;
349 }
350 return true;
351}
352
353void
akmhoque2f423352014-06-03 11:49:35 -0500354Lsdb::writeNameLsdbLog()
akmhoque53353462014-04-22 08:43:45 -0500355{
dmcoomes5bcb39e2017-10-31 15:07:55 -0500356 NLSR_LOG_DEBUG("---------------Name LSDB-------------------");
Ashlesh Gawandee8d8bd52018-08-09 17:18:51 -0500357 for (const auto& nlsa : m_nameLsdb) {
358 nlsa.writeLog();
akmhoque53353462014-04-22 08:43:45 -0500359 }
360}
361
Jiewen Tana0497d82015-02-02 21:59:18 -0800362const std::list<NameLsa>&
Nick Gordon114537f2017-08-09 14:51:37 -0500363Lsdb::getNameLsdb() const
Jiewen Tana0497d82015-02-02 21:59:18 -0800364{
365 return m_nameLsdb;
366}
367
akmhoque53353462014-04-22 08:43:45 -0500368// Cor LSA and LSDB related Functions start here
369
Nick G97e34942016-07-11 14:46:27 -0500370/*! \brief Compares whether an LSA object is the same as a key.
371 \param clsa The cor. LSA to check the identity of.
372 \param key The key of the publishing router to check against.
373*/
akmhoque53353462014-04-22 08:43:45 -0500374static bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500375corLsaCompareByKey(const CoordinateLsa& clsa, const ndn::Name& key)
akmhoque53353462014-04-22 08:43:45 -0500376{
377 return clsa.getKey() == key;
378}
379
380bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500381Lsdb::buildAndInstallOwnCoordinateLsa()
akmhoque53353462014-04-22 08:43:45 -0500382{
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600383 CoordinateLsa corLsa(m_confParam.getRouterPrefix(),
Ashlesh Gawande3e105a02017-05-16 17:36:56 -0500384 m_sequencingManager.getCorLsaSeq() + 1,
akmhoquec7a79b22014-05-26 08:06:19 -0500385 getLsaExpirationTimePoint(),
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600386 m_confParam.getCorR(),
387 m_confParam.getCorTheta());
Nick Gordon5c467f02016-07-13 13:40:10 -0500388
389 // Sync coordinate LSAs if using HR or HR dry run.
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600390 if (m_confParam.getHyperbolicState() != HYPERBOLIC_STATE_OFF) {
Ashlesh Gawande3e105a02017-05-16 17:36:56 -0500391 m_sequencingManager.increaseCorLsaSeq();
392 m_sequencingManager.writeSeqNoToFile();
Nick Gordon727d4832017-10-13 18:04:25 -0500393 m_sync.publishRoutingUpdate(Lsa::Type::COORDINATE, m_sequencingManager.getCorLsaSeq());
Nick Gordon5c467f02016-07-13 13:40:10 -0500394 }
395
akmhoque31d1d4b2014-05-05 22:08:14 -0500396 installCoordinateLsa(corLsa);
Nick Gordon5c467f02016-07-13 13:40:10 -0500397
akmhoque53353462014-04-22 08:43:45 -0500398 return true;
399}
400
akmhoqueb6450b12014-04-24 00:01:03 -0500401CoordinateLsa*
akmhoque31d1d4b2014-05-05 22:08:14 -0500402Lsdb::findCoordinateLsa(const ndn::Name& key)
akmhoque53353462014-04-22 08:43:45 -0500403{
akmhoqueb6450b12014-04-24 00:01:03 -0500404 std::list<CoordinateLsa>::iterator it = std::find_if(m_corLsdb.begin(),
405 m_corLsdb.end(),
dmcoomes9f936662017-03-02 10:33:09 -0600406 std::bind(corLsaCompareByKey, _1, key));
akmhoque157b0a42014-05-13 00:26:37 -0500407 if (it != m_corLsdb.end()) {
akmhoqueb6450b12014-04-24 00:01:03 -0500408 return &(*it);
akmhoque53353462014-04-22 08:43:45 -0500409 }
akmhoqueb6450b12014-04-24 00:01:03 -0500410 return 0;
akmhoque53353462014-04-22 08:43:45 -0500411}
412
413bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500414Lsdb::isCoordinateLsaNew(const ndn::Name& key, uint64_t seqNo)
akmhoque53353462014-04-22 08:43:45 -0500415{
akmhoqueb6450b12014-04-24 00:01:03 -0500416 CoordinateLsa* clsa = findCoordinateLsa(key);
Nick G97e34942016-07-11 14:46:27 -0500417 // Is the coordinate LSA in the LSDB already
akmhoque157b0a42014-05-13 00:26:37 -0500418 if (clsa != 0) {
Nick G97e34942016-07-11 14:46:27 -0500419 // And the seq no is newer (higher) than the current one
akmhoque157b0a42014-05-13 00:26:37 -0500420 if (clsa->getLsSeqNo() < seqNo) {
akmhoque53353462014-04-22 08:43:45 -0500421 return true;
422 }
akmhoque157b0a42014-05-13 00:26:37 -0500423 else {
akmhoque53353462014-04-22 08:43:45 -0500424 return false;
425 }
426 }
427 return true;
428}
429
Nick G97e34942016-07-11 14:46:27 -0500430 // Schedules a refresh/expire event in the scheduler.
431 // \param key The name of the router that published the LSA.
432 // \param seqNo the seq. no. associated with the LSA to check.
433 // \param expTime How long to wait before triggering the event.
akmhoque53353462014-04-22 08:43:45 -0500434ndn::EventId
akmhoque31d1d4b2014-05-05 22:08:14 -0500435Lsdb::scheduleCoordinateLsaExpiration(const ndn::Name& key, int seqNo,
akmhoquec7a79b22014-05-26 08:06:19 -0500436 const ndn::time::seconds& expTime)
akmhoque53353462014-04-22 08:43:45 -0500437{
Vince Lehman7c603292014-09-11 17:48:16 -0500438 return m_scheduler.scheduleEvent(expTime + GRACE_PERIOD,
Ashlesh Gawande90173ad2017-08-09 15:19:50 -0500439 std::bind(&Lsdb::expireOrRefreshCoordinateLsa,
Vince Lehman7c603292014-09-11 17:48:16 -0500440 this, key, seqNo));
akmhoque53353462014-04-22 08:43:45 -0500441}
442
443bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500444Lsdb::installCoordinateLsa(CoordinateLsa& clsa)
akmhoque53353462014-04-22 08:43:45 -0500445{
Alexander Afanasyev8388ec62014-08-16 18:38:57 -0700446 ndn::time::seconds timeToExpire = m_lsaRefreshTime;
akmhoqueb6450b12014-04-24 00:01:03 -0500447 CoordinateLsa* chkCorLsa = findCoordinateLsa(clsa.getKey());
Nick G97e34942016-07-11 14:46:27 -0500448 // Checking whether the LSA is new or not.
akmhoque157b0a42014-05-13 00:26:37 -0500449 if (chkCorLsa == 0) {
dmcoomes5bcb39e2017-10-31 15:07:55 -0500450 NLSR_LOG_DEBUG("New Coordinate LSA. Adding to LSDB");
451 NLSR_LOG_DEBUG("Adding Coordinate Lsa");
akmhoque674b0b12014-05-20 14:33:28 -0500452 clsa.writeLog();
akmhoqueb6450b12014-04-24 00:01:03 -0500453 addCoordinateLsa(clsa);
akmhoque2f423352014-06-03 11:49:35 -0500454
Nick Gordon5c467f02016-07-13 13:40:10 -0500455 // Register the LSA's origin router prefix
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600456 if (clsa.getOrigRouter() != m_confParam.getRouterPrefix()) {
457 m_namePrefixTable.addEntry(clsa.getOrigRouter(),
akmhoque31d1d4b2014-05-05 22:08:14 -0500458 clsa.getOrigRouter());
akmhoque53353462014-04-22 08:43:45 -0500459 }
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600460 if (m_confParam.getHyperbolicState() != HYPERBOLIC_STATE_OFF) {
461 m_routingTable.scheduleRoutingTableCalculation();
akmhoque53353462014-04-22 08:43:45 -0500462 }
Nick G97e34942016-07-11 14:46:27 -0500463 // Set the expiration time for the new LSA.
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600464 if (clsa.getOrigRouter() != m_confParam.getRouterPrefix()) {
akmhoquec7a79b22014-05-26 08:06:19 -0500465 ndn::time::system_clock::Duration duration = clsa.getExpirationTimePoint() -
466 ndn::time::system_clock::now();
467 timeToExpire = ndn::time::duration_cast<ndn::time::seconds>(duration);
akmhoque53353462014-04-22 08:43:45 -0500468 }
akmhoque31d1d4b2014-05-05 22:08:14 -0500469 scheduleCoordinateLsaExpiration(clsa.getKey(),
akmhoqueb6450b12014-04-24 00:01:03 -0500470 clsa.getLsSeqNo(), timeToExpire);
akmhoque53353462014-04-22 08:43:45 -0500471 }
Nick G97e34942016-07-11 14:46:27 -0500472 // We are just updating this LSA.
akmhoque157b0a42014-05-13 00:26:37 -0500473 else {
474 if (chkCorLsa->getLsSeqNo() < clsa.getLsSeqNo()) {
dmcoomes5bcb39e2017-10-31 15:07:55 -0500475 NLSR_LOG_DEBUG("Updated Coordinate LSA. Updating LSDB");
476 NLSR_LOG_DEBUG("Deleting Coordinate Lsa");
akmhoque674b0b12014-05-20 14:33:28 -0500477 chkCorLsa->writeLog();
akmhoqueb6450b12014-04-24 00:01:03 -0500478 chkCorLsa->setLsSeqNo(clsa.getLsSeqNo());
akmhoquec7a79b22014-05-26 08:06:19 -0500479 chkCorLsa->setExpirationTimePoint(clsa.getExpirationTimePoint());
Nick G97e34942016-07-11 14:46:27 -0500480 // If the new LSA contains new routing information, update the LSDB with it.
akmhoque157b0a42014-05-13 00:26:37 -0500481 if (!chkCorLsa->isEqualContent(clsa)) {
akmhoqueb6450b12014-04-24 00:01:03 -0500482 chkCorLsa->setCorRadius(clsa.getCorRadius());
483 chkCorLsa->setCorTheta(clsa.getCorTheta());
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600484 if (m_confParam.getHyperbolicState() >= HYPERBOLIC_STATE_ON) {
485 m_routingTable.scheduleRoutingTableCalculation();
akmhoque53353462014-04-22 08:43:45 -0500486 }
487 }
Nick G97e34942016-07-11 14:46:27 -0500488 // If this is an LSA from another router, refresh its expiration time.
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600489 if (clsa.getOrigRouter() != m_confParam.getRouterPrefix()) {
akmhoquec7a79b22014-05-26 08:06:19 -0500490 ndn::time::system_clock::Duration duration = clsa.getExpirationTimePoint() -
491 ndn::time::system_clock::now();
492 timeToExpire = ndn::time::duration_cast<ndn::time::seconds>(duration);
akmhoque53353462014-04-22 08:43:45 -0500493 }
akmhoque31d1d4b2014-05-05 22:08:14 -0500494 cancelScheduleLsaExpiringEvent(chkCorLsa->getExpiringEventId());
495 chkCorLsa->setExpiringEventId(scheduleCoordinateLsaExpiration(clsa.getKey(),
akmhoqueb6450b12014-04-24 00:01:03 -0500496 clsa.getLsSeqNo(),
497 timeToExpire));
dmcoomes5bcb39e2017-10-31 15:07:55 -0500498 NLSR_LOG_DEBUG("Adding Coordinate Lsa");
akmhoque674b0b12014-05-20 14:33:28 -0500499 chkCorLsa->writeLog();
akmhoque53353462014-04-22 08:43:45 -0500500 }
501 }
502 return true;
503}
504
505bool
akmhoqueb6450b12014-04-24 00:01:03 -0500506Lsdb::addCoordinateLsa(CoordinateLsa& clsa)
akmhoque53353462014-04-22 08:43:45 -0500507{
akmhoqueb6450b12014-04-24 00:01:03 -0500508 std::list<CoordinateLsa>::iterator it = std::find_if(m_corLsdb.begin(),
509 m_corLsdb.end(),
dmcoomes9f936662017-03-02 10:33:09 -0600510 std::bind(corLsaCompareByKey, _1,
akmhoque157b0a42014-05-13 00:26:37 -0500511 clsa.getKey()));
512 if (it == m_corLsdb.end()) {
akmhoque53353462014-04-22 08:43:45 -0500513 m_corLsdb.push_back(clsa);
514 return true;
515 }
516 return false;
517}
518
519bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500520Lsdb::removeCoordinateLsa(const ndn::Name& key)
akmhoque53353462014-04-22 08:43:45 -0500521{
akmhoqueb6450b12014-04-24 00:01:03 -0500522 std::list<CoordinateLsa>::iterator it = std::find_if(m_corLsdb.begin(),
523 m_corLsdb.end(),
dmcoomes9f936662017-03-02 10:33:09 -0600524 std::bind(corLsaCompareByKey,
akmhoque157b0a42014-05-13 00:26:37 -0500525 _1, key));
526 if (it != m_corLsdb.end()) {
dmcoomes5bcb39e2017-10-31 15:07:55 -0500527 NLSR_LOG_DEBUG("Deleting Coordinate Lsa");
Nick Gordon5c467f02016-07-13 13:40:10 -0500528 it->writeLog();
529
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600530 if (it->getOrigRouter() != m_confParam.getRouterPrefix()) {
531 m_namePrefixTable.removeEntry(it->getOrigRouter(), it->getOrigRouter());
akmhoque53353462014-04-22 08:43:45 -0500532 }
Nick Gordon5c467f02016-07-13 13:40:10 -0500533
akmhoque53353462014-04-22 08:43:45 -0500534 m_corLsdb.erase(it);
535 return true;
536 }
537 return false;
538}
539
540bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500541Lsdb::doesCoordinateLsaExist(const ndn::Name& key)
akmhoque53353462014-04-22 08:43:45 -0500542{
akmhoqueb6450b12014-04-24 00:01:03 -0500543 std::list<CoordinateLsa>::iterator it = std::find_if(m_corLsdb.begin(),
544 m_corLsdb.end(),
dmcoomes9f936662017-03-02 10:33:09 -0600545 std::bind(corLsaCompareByKey,
akmhoque157b0a42014-05-13 00:26:37 -0500546 _1, key));
547 if (it == m_corLsdb.end()) {
akmhoque53353462014-04-22 08:43:45 -0500548 return false;
549 }
550 return true;
551}
552
553void
akmhoque2f423352014-06-03 11:49:35 -0500554Lsdb::writeCorLsdbLog()
akmhoque53353462014-04-22 08:43:45 -0500555{
dmcoomes5bcb39e2017-10-31 15:07:55 -0500556 NLSR_LOG_DEBUG("---------------Cor LSDB-------------------");
Ashlesh Gawandee8d8bd52018-08-09 17:18:51 -0500557 for (const auto& corLsa : m_corLsdb) {
558 corLsa.writeLog();
akmhoque53353462014-04-22 08:43:45 -0500559 }
560}
561
Jiewen Tana0497d82015-02-02 21:59:18 -0800562const std::list<CoordinateLsa>&
Nick Gordon114537f2017-08-09 14:51:37 -0500563Lsdb::getCoordinateLsdb() const
Jiewen Tana0497d82015-02-02 21:59:18 -0800564{
565 return m_corLsdb;
566}
567
akmhoque53353462014-04-22 08:43:45 -0500568// Adj LSA and LSDB related function starts here
569
Nick G97e34942016-07-11 14:46:27 -0500570 /*! \brief Returns whether an adj. LSA object is from some router.
571 \param alsa The adj. LSA object.
572 \param key The router name that you want to compare the LSA with.
573 */
akmhoque53353462014-04-22 08:43:45 -0500574static bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500575adjLsaCompareByKey(AdjLsa& alsa, const ndn::Name& key)
akmhoque53353462014-04-22 08:43:45 -0500576{
577 return alsa.getKey() == key;
578}
579
akmhoque53353462014-04-22 08:43:45 -0500580void
Vince Lehman50df6b72015-03-03 12:06:40 -0600581Lsdb::scheduleAdjLsaBuild()
akmhoque53353462014-04-22 08:43:45 -0500582{
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600583 m_adjBuildCount++;
Vince Lehman50df6b72015-03-03 12:06:40 -0600584
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600585 if (m_confParam.getHyperbolicState() == HYPERBOLIC_STATE_ON) {
Nick Gordon5c467f02016-07-13 13:40:10 -0500586 // Don't build adjacency LSAs in hyperbolic routing
dmcoomes5bcb39e2017-10-31 15:07:55 -0500587 NLSR_LOG_DEBUG("Adjacency LSA not built. Currently in hyperbolic routing state.");
Nick Gordon5c467f02016-07-13 13:40:10 -0500588 return;
589 }
590
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600591 if (m_isBuildAdjLsaSheduled == false) {
dmcoomes5bcb39e2017-10-31 15:07:55 -0500592 NLSR_LOG_DEBUG("Scheduling Adjacency LSA build in " << m_adjLsaBuildInterval);
Vince Lehman50df6b72015-03-03 12:06:40 -0600593
dmcoomes9f936662017-03-02 10:33:09 -0600594 m_scheduler.scheduleEvent(m_adjLsaBuildInterval, std::bind(&Lsdb::buildAdjLsa, this));
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600595 m_isBuildAdjLsaSheduled = true;
Vince Lehman50df6b72015-03-03 12:06:40 -0600596 }
597}
598
599void
600Lsdb::buildAdjLsa()
601{
dmcoomes5bcb39e2017-10-31 15:07:55 -0500602 NLSR_LOG_TRACE("Lsdb::buildAdjLsa called");
Vince Lehman50df6b72015-03-03 12:06:40 -0600603
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600604 m_isBuildAdjLsaSheduled = false;
Vince Lehmanf7eec4f2015-05-08 19:02:31 -0500605
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600606 if (m_confParam.getAdjacencyList().isAdjLsaBuildable(m_confParam.getInterestRetryNumber())) {
Vince Lehmanf7eec4f2015-05-08 19:02:31 -0500607
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600608 int adjBuildCount = m_adjBuildCount;
Nick G97e34942016-07-11 14:46:27 -0500609 // Only do the adjLsa build if there's one scheduled
akmhoque157b0a42014-05-13 00:26:37 -0500610 if (adjBuildCount > 0) {
Nick G97e34942016-07-11 14:46:27 -0500611 // It only makes sense to do the adjLsa build if we have neighbors
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600612 if (m_confParam.getAdjacencyList().getNumOfActiveNeighbor() > 0) {
dmcoomes5bcb39e2017-10-31 15:07:55 -0500613 NLSR_LOG_DEBUG("Building and installing own Adj LSA");
akmhoque31d1d4b2014-05-05 22:08:14 -0500614 buildAndInstallOwnAdjLsa();
akmhoque53353462014-04-22 08:43:45 -0500615 }
Nick G97e34942016-07-11 14:46:27 -0500616 // We have no active neighbors, meaning no one can route through
617 // us. So delete our entry in the LSDB. This prevents this
618 // router from refreshing the LSA, eventually causing other
619 // routers to delete it, too.
akmhoque157b0a42014-05-13 00:26:37 -0500620 else {
dmcoomes5bcb39e2017-10-31 15:07:55 -0500621 NLSR_LOG_DEBUG("Removing own Adj LSA; no ACTIVE neighbors");
Nick G97e34942016-07-11 14:46:27 -0500622 // Get this router's key
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600623 ndn::Name key = m_confParam.getRouterPrefix();
Nick Gordon727d4832017-10-13 18:04:25 -0500624 key.append(std::to_string(Lsa::Type::ADJACENCY));
Vince Lehmanf7eec4f2015-05-08 19:02:31 -0500625
akmhoque31d1d4b2014-05-05 22:08:14 -0500626 removeAdjLsa(key);
Nick G97e34942016-07-11 14:46:27 -0500627 // Recompute routing table after removal
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600628 m_routingTable.scheduleRoutingTableCalculation();
akmhoque53353462014-04-22 08:43:45 -0500629 }
Nick G97e34942016-07-11 14:46:27 -0500630 // In the case that during building the adj LSA, the FIB has to
631 // wait on an Interest response, the number of scheduled adj LSA
632 // builds could change, so we shouldn't just set it to 0.
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600633 m_adjBuildCount = m_adjBuildCount - adjBuildCount;
akmhoque53353462014-04-22 08:43:45 -0500634 }
635 }
Nick G97e34942016-07-11 14:46:27 -0500636 // We are still waiting to know the adjacency status of some
637 // neighbor, so schedule a build for later (when all that has
638 // hopefully finished)
639 else {
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600640 m_isBuildAdjLsaSheduled = true;
641 int schedulingTime = m_confParam.getInterestRetryNumber() *
642 m_confParam.getInterestResendTime();
Nick G97e34942016-07-11 14:46:27 -0500643 m_scheduler.scheduleEvent(ndn::time::seconds(schedulingTime),
dmcoomes9f936662017-03-02 10:33:09 -0600644 std::bind(&Lsdb::buildAdjLsa, this));
Nick G97e34942016-07-11 14:46:27 -0500645 }
akmhoque53353462014-04-22 08:43:45 -0500646}
647
akmhoque53353462014-04-22 08:43:45 -0500648bool
649Lsdb::addAdjLsa(AdjLsa& alsa)
650{
651 std::list<AdjLsa>::iterator it = std::find_if(m_adjLsdb.begin(),
652 m_adjLsdb.end(),
dmcoomes9f936662017-03-02 10:33:09 -0600653 std::bind(adjLsaCompareByKey, _1,
akmhoque53353462014-04-22 08:43:45 -0500654 alsa.getKey()));
akmhoque157b0a42014-05-13 00:26:37 -0500655 if (it == m_adjLsdb.end()) {
akmhoque53353462014-04-22 08:43:45 -0500656 m_adjLsdb.push_back(alsa);
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600657 // Add any new name prefixes to the NPT
658 // Only add NPT entries if this is an adj LSA from another router.
659 if (alsa.getOrigRouter() != m_confParam.getRouterPrefix()) {
660 // Pass the originating router as both the name to register and
661 // where it came from.
662 m_namePrefixTable.addEntry(alsa.getOrigRouter(), alsa.getOrigRouter());
663 }
akmhoque53353462014-04-22 08:43:45 -0500664 return true;
665 }
666 return false;
667}
668
akmhoqueb6450b12014-04-24 00:01:03 -0500669AdjLsa*
akmhoque31d1d4b2014-05-05 22:08:14 -0500670Lsdb::findAdjLsa(const ndn::Name& key)
akmhoque53353462014-04-22 08:43:45 -0500671{
672 std::list<AdjLsa>::iterator it = std::find_if(m_adjLsdb.begin(),
673 m_adjLsdb.end(),
dmcoomes9f936662017-03-02 10:33:09 -0600674 std::bind(adjLsaCompareByKey, _1, key));
akmhoque157b0a42014-05-13 00:26:37 -0500675 if (it != m_adjLsdb.end()) {
akmhoqueb6450b12014-04-24 00:01:03 -0500676 return &(*it);
akmhoque53353462014-04-22 08:43:45 -0500677 }
akmhoqueb6450b12014-04-24 00:01:03 -0500678 return 0;
akmhoque53353462014-04-22 08:43:45 -0500679}
680
akmhoque53353462014-04-22 08:43:45 -0500681bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500682Lsdb::isAdjLsaNew(const ndn::Name& key, uint64_t seqNo)
akmhoque53353462014-04-22 08:43:45 -0500683{
akmhoqueb6450b12014-04-24 00:01:03 -0500684 AdjLsa* adjLsaCheck = findAdjLsa(key);
Nick G97e34942016-07-11 14:46:27 -0500685 // If it is in the LSDB
akmhoque157b0a42014-05-13 00:26:37 -0500686 if (adjLsaCheck != 0) {
Nick G97e34942016-07-11 14:46:27 -0500687 // And the supplied seq no is newer (higher) than the current one.
akmhoque157b0a42014-05-13 00:26:37 -0500688 if (adjLsaCheck->getLsSeqNo() < seqNo) {
akmhoque53353462014-04-22 08:43:45 -0500689 return true;
690 }
akmhoque157b0a42014-05-13 00:26:37 -0500691 else {
akmhoque53353462014-04-22 08:43:45 -0500692 return false;
693 }
694 }
695 return true;
696}
697
akmhoque53353462014-04-22 08:43:45 -0500698ndn::EventId
akmhoquec7a79b22014-05-26 08:06:19 -0500699Lsdb::scheduleAdjLsaExpiration(const ndn::Name& key, int seqNo,
700 const ndn::time::seconds& expTime)
akmhoque53353462014-04-22 08:43:45 -0500701{
Vince Lehman7c603292014-09-11 17:48:16 -0500702 return m_scheduler.scheduleEvent(expTime + GRACE_PERIOD,
Ashlesh Gawande90173ad2017-08-09 15:19:50 -0500703 std::bind(&Lsdb::expireOrRefreshAdjLsa, this, key, seqNo));
akmhoque53353462014-04-22 08:43:45 -0500704}
705
706bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500707Lsdb::installAdjLsa(AdjLsa& alsa)
akmhoque53353462014-04-22 08:43:45 -0500708{
Alexander Afanasyev8388ec62014-08-16 18:38:57 -0700709 ndn::time::seconds timeToExpire = m_lsaRefreshTime;
akmhoqueb6450b12014-04-24 00:01:03 -0500710 AdjLsa* chkAdjLsa = findAdjLsa(alsa.getKey());
Nick G97e34942016-07-11 14:46:27 -0500711 // If this adj. LSA is not in the LSDB already
akmhoque157b0a42014-05-13 00:26:37 -0500712 if (chkAdjLsa == 0) {
dmcoomes5bcb39e2017-10-31 15:07:55 -0500713 NLSR_LOG_DEBUG("New Adj LSA. Adding to LSDB");
714 NLSR_LOG_DEBUG("Adding Adj Lsa");
akmhoque674b0b12014-05-20 14:33:28 -0500715 alsa.writeLog();
akmhoque53353462014-04-22 08:43:45 -0500716 addAdjLsa(alsa);
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600717
718 m_routingTable.scheduleRoutingTableCalculation();
719 if (alsa.getOrigRouter() != m_confParam.getRouterPrefix()) {
akmhoquec7a79b22014-05-26 08:06:19 -0500720 ndn::time::system_clock::Duration duration = alsa.getExpirationTimePoint() -
721 ndn::time::system_clock::now();
722 timeToExpire = ndn::time::duration_cast<ndn::time::seconds>(duration);
akmhoque53353462014-04-22 08:43:45 -0500723 }
akmhoque31d1d4b2014-05-05 22:08:14 -0500724 scheduleAdjLsaExpiration(alsa.getKey(),
akmhoque53353462014-04-22 08:43:45 -0500725 alsa.getLsSeqNo(), timeToExpire);
726 }
akmhoque157b0a42014-05-13 00:26:37 -0500727 else {
728 if (chkAdjLsa->getLsSeqNo() < alsa.getLsSeqNo()) {
dmcoomes5bcb39e2017-10-31 15:07:55 -0500729 NLSR_LOG_DEBUG("Updated Adj LSA. Updating LSDB");
730 NLSR_LOG_DEBUG("Deleting Adj Lsa");
akmhoque674b0b12014-05-20 14:33:28 -0500731 chkAdjLsa->writeLog();
akmhoqueb6450b12014-04-24 00:01:03 -0500732 chkAdjLsa->setLsSeqNo(alsa.getLsSeqNo());
akmhoquec7a79b22014-05-26 08:06:19 -0500733 chkAdjLsa->setExpirationTimePoint(alsa.getExpirationTimePoint());
Nick G97e34942016-07-11 14:46:27 -0500734 // If the new adj LSA has new content, update the contents of
735 // the LSDB entry. Additionally, since we've changed the
736 // contents of the LSDB, we have to schedule a routing
737 // calculation.
akmhoque157b0a42014-05-13 00:26:37 -0500738 if (!chkAdjLsa->isEqualContent(alsa)) {
akmhoqueb6450b12014-04-24 00:01:03 -0500739 chkAdjLsa->getAdl().reset();
akmhoquefdbddb12014-05-02 18:35:19 -0500740 chkAdjLsa->getAdl().addAdjacents(alsa.getAdl());
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600741 m_routingTable.scheduleRoutingTableCalculation();
akmhoque53353462014-04-22 08:43:45 -0500742 }
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600743 if (alsa.getOrigRouter() != m_confParam.getRouterPrefix()) {
akmhoquec7a79b22014-05-26 08:06:19 -0500744 ndn::time::system_clock::Duration duration = alsa.getExpirationTimePoint() -
745 ndn::time::system_clock::now();
746 timeToExpire = ndn::time::duration_cast<ndn::time::seconds>(duration);
akmhoque53353462014-04-22 08:43:45 -0500747 }
akmhoque31d1d4b2014-05-05 22:08:14 -0500748 cancelScheduleLsaExpiringEvent(chkAdjLsa->getExpiringEventId());
749 chkAdjLsa->setExpiringEventId(scheduleAdjLsaExpiration(alsa.getKey(),
akmhoqueb6450b12014-04-24 00:01:03 -0500750 alsa.getLsSeqNo(),
751 timeToExpire));
dmcoomes5bcb39e2017-10-31 15:07:55 -0500752 NLSR_LOG_DEBUG("Adding Adj Lsa");
akmhoque674b0b12014-05-20 14:33:28 -0500753 chkAdjLsa->writeLog();
akmhoque53353462014-04-22 08:43:45 -0500754 }
755 }
756 return true;
757}
758
759bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500760Lsdb::buildAndInstallOwnAdjLsa()
akmhoque53353462014-04-22 08:43:45 -0500761{
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600762 AdjLsa adjLsa(m_confParam.getRouterPrefix(),
Ashlesh Gawande3e105a02017-05-16 17:36:56 -0500763 m_sequencingManager.getAdjLsaSeq() + 1,
akmhoquec7a79b22014-05-26 08:06:19 -0500764 getLsaExpirationTimePoint(),
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600765 m_confParam.getAdjacencyList().getNumOfActiveNeighbor(),
766 m_confParam.getAdjacencyList());
Vince Lehman904c2412014-09-23 19:36:11 -0500767
Nick Gordon5c467f02016-07-13 13:40:10 -0500768 //Sync adjacency LSAs if link-state or dry-run HR is enabled.
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600769 if (m_confParam.getHyperbolicState() != HYPERBOLIC_STATE_ON) {
Ashlesh Gawande3e105a02017-05-16 17:36:56 -0500770 m_sequencingManager.increaseAdjLsaSeq();
771 m_sequencingManager.writeSeqNoToFile();
Nick Gordon727d4832017-10-13 18:04:25 -0500772 m_sync.publishRoutingUpdate(Lsa::Type::ADJACENCY, m_sequencingManager.getAdjLsaSeq());
Nick Gordon5c467f02016-07-13 13:40:10 -0500773 }
Vince Lehman904c2412014-09-23 19:36:11 -0500774
Vince Lehman9d097802015-03-16 17:55:59 -0500775 return installAdjLsa(adjLsa);
akmhoque53353462014-04-22 08:43:45 -0500776}
777
778bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500779Lsdb::removeAdjLsa(const ndn::Name& key)
akmhoque53353462014-04-22 08:43:45 -0500780{
781 std::list<AdjLsa>::iterator it = std::find_if(m_adjLsdb.begin(),
782 m_adjLsdb.end(),
dmcoomes9f936662017-03-02 10:33:09 -0600783 std::bind(adjLsaCompareByKey, _1, key));
akmhoque157b0a42014-05-13 00:26:37 -0500784 if (it != m_adjLsdb.end()) {
dmcoomes5bcb39e2017-10-31 15:07:55 -0500785 NLSR_LOG_DEBUG("Deleting Adj Lsa");
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600786 it->writeLog();
787 if (it->getOrigRouter() != m_confParam.getRouterPrefix()) {
788 m_namePrefixTable.removeEntry(it->getOrigRouter(), it->getOrigRouter());
789 }
akmhoque53353462014-04-22 08:43:45 -0500790 m_adjLsdb.erase(it);
791 return true;
792 }
793 return false;
794}
795
796bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500797Lsdb::doesAdjLsaExist(const ndn::Name& key)
akmhoque53353462014-04-22 08:43:45 -0500798{
799 std::list<AdjLsa>::iterator it = std::find_if(m_adjLsdb.begin(),
800 m_adjLsdb.end(),
dmcoomes9f936662017-03-02 10:33:09 -0600801 std::bind(adjLsaCompareByKey, _1, key));
akmhoque157b0a42014-05-13 00:26:37 -0500802 if (it == m_adjLsdb.end()) {
akmhoque53353462014-04-22 08:43:45 -0500803 return false;
804 }
805 return true;
806}
807
Jiewen Tana0497d82015-02-02 21:59:18 -0800808const std::list<AdjLsa>&
Nick Gordon114537f2017-08-09 14:51:37 -0500809Lsdb::getAdjLsdb() const
akmhoque53353462014-04-22 08:43:45 -0500810{
811 return m_adjLsdb;
812}
813
Nick G97e34942016-07-11 14:46:27 -0500814 // This function determines whether a name LSA should be refreshed
815 // or expired. The conditions for getting refreshed are: it is still
816 // in the LSDB, it hasn't been updated by something else already (as
817 // evidenced by its seq. no.), and this is the originating router for
818 // the LSA. Is it let expire in all other cases.
819 // lsaKey is the key of the LSA's publishing router.
820 // seqNo is the seq. no. of the candidate LSA.
akmhoque53353462014-04-22 08:43:45 -0500821void
Ashlesh Gawande90173ad2017-08-09 15:19:50 -0500822Lsdb::expireOrRefreshNameLsa(const ndn::Name& lsaKey, uint64_t seqNo)
akmhoque53353462014-04-22 08:43:45 -0500823{
dmcoomes5bcb39e2017-10-31 15:07:55 -0500824 NLSR_LOG_DEBUG("Lsdb::expireOrRefreshNameLsa Called");
825 NLSR_LOG_DEBUG("LSA Key : " << lsaKey << " Seq No: " << seqNo);
akmhoqueb6450b12014-04-24 00:01:03 -0500826 NameLsa* chkNameLsa = findNameLsa(lsaKey);
Nick G97e34942016-07-11 14:46:27 -0500827 // If this name LSA exists in the LSDB
akmhoque157b0a42014-05-13 00:26:37 -0500828 if (chkNameLsa != 0) {
dmcoomes5bcb39e2017-10-31 15:07:55 -0500829 NLSR_LOG_DEBUG("LSA Exists with seq no: " << chkNameLsa->getLsSeqNo());
Nick G97e34942016-07-11 14:46:27 -0500830 // If its seq no is the one we are expecting.
akmhoque157b0a42014-05-13 00:26:37 -0500831 if (chkNameLsa->getLsSeqNo() == seqNo) {
832 if (chkNameLsa->getOrigRouter() == m_thisRouterPrefix) {
dmcoomes5bcb39e2017-10-31 15:07:55 -0500833 NLSR_LOG_DEBUG("Own Name LSA, so refreshing it");
834 NLSR_LOG_DEBUG("Deleting Name Lsa");
akmhoqueb6450b12014-04-24 00:01:03 -0500835 chkNameLsa->writeLog();
akmhoqueb6450b12014-04-24 00:01:03 -0500836 chkNameLsa->setLsSeqNo(chkNameLsa->getLsSeqNo() + 1);
Ashlesh Gawande3e105a02017-05-16 17:36:56 -0500837 m_sequencingManager.setNameLsaSeq(chkNameLsa->getLsSeqNo());
akmhoquec7a79b22014-05-26 08:06:19 -0500838 chkNameLsa->setExpirationTimePoint(getLsaExpirationTimePoint());
dmcoomes5bcb39e2017-10-31 15:07:55 -0500839 NLSR_LOG_DEBUG("Adding Name Lsa");
akmhoqueb6450b12014-04-24 00:01:03 -0500840 chkNameLsa->writeLog();
akmhoquefdbddb12014-05-02 18:35:19 -0500841 // schedule refreshing event again
akmhoque31d1d4b2014-05-05 22:08:14 -0500842 chkNameLsa->setExpiringEventId(scheduleNameLsaExpiration(chkNameLsa->getKey(),
akmhoquefdbddb12014-05-02 18:35:19 -0500843 chkNameLsa->getLsSeqNo(),
Alexander Afanasyev8388ec62014-08-16 18:38:57 -0700844 m_lsaRefreshTime));
Ashlesh Gawande3e105a02017-05-16 17:36:56 -0500845 m_sequencingManager.writeSeqNoToFile();
Nick Gordon727d4832017-10-13 18:04:25 -0500846 m_sync.publishRoutingUpdate(Lsa::Type::NAME, m_sequencingManager.getNameLsaSeq());
akmhoque53353462014-04-22 08:43:45 -0500847 }
Nick G97e34942016-07-11 14:46:27 -0500848 // Since we cannot refresh other router's LSAs, our only choice is to expire.
akmhoque157b0a42014-05-13 00:26:37 -0500849 else {
dmcoomes5bcb39e2017-10-31 15:07:55 -0500850 NLSR_LOG_DEBUG("Other's Name LSA, so removing from LSDB");
akmhoque31d1d4b2014-05-05 22:08:14 -0500851 removeNameLsa(lsaKey);
akmhoque53353462014-04-22 08:43:45 -0500852 }
853 }
854 }
855}
856
Nick G97e34942016-07-11 14:46:27 -0500857 // This function determines whether an adj. LSA should be refreshed
858 // or expired. The conditions for getting refreshed are: it is still
859 // in the LSDB, it hasn't been updated by something else already (as
860 // evidenced by its seq. no.), and this is the originating router for
861 // the LSA. Is it let expire in all other cases.
862 // lsaKey is the key of the LSA's publishing router.
863 // seqNo is the seq. no. of the candidate LSA.
akmhoque53353462014-04-22 08:43:45 -0500864void
Ashlesh Gawande90173ad2017-08-09 15:19:50 -0500865Lsdb::expireOrRefreshAdjLsa(const ndn::Name& lsaKey, uint64_t seqNo)
akmhoque53353462014-04-22 08:43:45 -0500866{
dmcoomes5bcb39e2017-10-31 15:07:55 -0500867 NLSR_LOG_DEBUG("Lsdb::expireOrRefreshAdjLsa Called");
868 NLSR_LOG_DEBUG("LSA Key: " << lsaKey << " Seq No: " << seqNo);
akmhoqueb6450b12014-04-24 00:01:03 -0500869 AdjLsa* chkAdjLsa = findAdjLsa(lsaKey);
Nick G97e34942016-07-11 14:46:27 -0500870 // If this is a valid LSA
akmhoque157b0a42014-05-13 00:26:37 -0500871 if (chkAdjLsa != 0) {
dmcoomes5bcb39e2017-10-31 15:07:55 -0500872 NLSR_LOG_DEBUG("LSA Exists with seq no: " << chkAdjLsa->getLsSeqNo());
Nick G97e34942016-07-11 14:46:27 -0500873 // And if it hasn't been updated for some other reason
akmhoque157b0a42014-05-13 00:26:37 -0500874 if (chkAdjLsa->getLsSeqNo() == seqNo) {
Nick G97e34942016-07-11 14:46:27 -0500875 // If it is our own LSA
akmhoque157b0a42014-05-13 00:26:37 -0500876 if (chkAdjLsa->getOrigRouter() == m_thisRouterPrefix) {
dmcoomes5bcb39e2017-10-31 15:07:55 -0500877 NLSR_LOG_DEBUG("Own Adj LSA, so refreshing it");
878 NLSR_LOG_DEBUG("Deleting Adj Lsa");
akmhoque2f423352014-06-03 11:49:35 -0500879 chkAdjLsa->writeLog();
akmhoqueb6450b12014-04-24 00:01:03 -0500880 chkAdjLsa->setLsSeqNo(chkAdjLsa->getLsSeqNo() + 1);
Ashlesh Gawande3e105a02017-05-16 17:36:56 -0500881 m_sequencingManager.setAdjLsaSeq(chkAdjLsa->getLsSeqNo());
akmhoquec7a79b22014-05-26 08:06:19 -0500882 chkAdjLsa->setExpirationTimePoint(getLsaExpirationTimePoint());
dmcoomes5bcb39e2017-10-31 15:07:55 -0500883 NLSR_LOG_DEBUG("Adding Adj Lsa");
akmhoque2f423352014-06-03 11:49:35 -0500884 chkAdjLsa->writeLog();
akmhoquefdbddb12014-05-02 18:35:19 -0500885 // schedule refreshing event again
akmhoque31d1d4b2014-05-05 22:08:14 -0500886 chkAdjLsa->setExpiringEventId(scheduleAdjLsaExpiration(chkAdjLsa->getKey(),
akmhoquefdbddb12014-05-02 18:35:19 -0500887 chkAdjLsa->getLsSeqNo(),
Alexander Afanasyev8388ec62014-08-16 18:38:57 -0700888 m_lsaRefreshTime));
Ashlesh Gawande3e105a02017-05-16 17:36:56 -0500889 m_sequencingManager.writeSeqNoToFile();
Nick Gordon727d4832017-10-13 18:04:25 -0500890 m_sync.publishRoutingUpdate(Lsa::Type::ADJACENCY, m_sequencingManager.getAdjLsaSeq());
akmhoque53353462014-04-22 08:43:45 -0500891 }
Nick G97e34942016-07-11 14:46:27 -0500892 // An LSA from another router is expiring
akmhoque157b0a42014-05-13 00:26:37 -0500893 else {
dmcoomes5bcb39e2017-10-31 15:07:55 -0500894 NLSR_LOG_DEBUG("Other's Adj LSA, so removing from LSDB");
akmhoque31d1d4b2014-05-05 22:08:14 -0500895 removeAdjLsa(lsaKey);
akmhoque53353462014-04-22 08:43:45 -0500896 }
Nick G97e34942016-07-11 14:46:27 -0500897 // We have changed the contents of the LSDB, so we have to
898 // schedule a routing calculation
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600899 m_routingTable.scheduleRoutingTableCalculation();
akmhoque53353462014-04-22 08:43:45 -0500900 }
901 }
902}
903
Nick G97e34942016-07-11 14:46:27 -0500904 // This function determines whether an adj. LSA should be refreshed
905 // or expired. The conditions for getting refreshed are: it is still
906 // in the LSDB, it hasn't been updated by something else already (as
907 // evidenced by its seq. no.), and this is the originating router for
908 // the LSA. It is let expire in all other cases.
909 // lsaKey is the key of the LSA's publishing router.
910 // seqNo is the seq. no. of the candidate LSA.
akmhoque53353462014-04-22 08:43:45 -0500911void
Ashlesh Gawande90173ad2017-08-09 15:19:50 -0500912Lsdb::expireOrRefreshCoordinateLsa(const ndn::Name& lsaKey,
akmhoqueb6450b12014-04-24 00:01:03 -0500913 uint64_t seqNo)
akmhoque53353462014-04-22 08:43:45 -0500914{
dmcoomes5bcb39e2017-10-31 15:07:55 -0500915 NLSR_LOG_DEBUG("Lsdb::expireOrRefreshCorLsa Called ");
916 NLSR_LOG_DEBUG("LSA Key : " << lsaKey << " Seq No: " << seqNo);
akmhoqueb6450b12014-04-24 00:01:03 -0500917 CoordinateLsa* chkCorLsa = findCoordinateLsa(lsaKey);
Nick G97e34942016-07-11 14:46:27 -0500918 // Whether the LSA is in the LSDB or not.
akmhoque157b0a42014-05-13 00:26:37 -0500919 if (chkCorLsa != 0) {
dmcoomes5bcb39e2017-10-31 15:07:55 -0500920 NLSR_LOG_DEBUG("LSA Exists with seq no: " << chkCorLsa->getLsSeqNo());
Nick G97e34942016-07-11 14:46:27 -0500921 // Whether the LSA has been updated without our knowledge.
akmhoque157b0a42014-05-13 00:26:37 -0500922 if (chkCorLsa->getLsSeqNo() == seqNo) {
923 if (chkCorLsa->getOrigRouter() == m_thisRouterPrefix) {
dmcoomes5bcb39e2017-10-31 15:07:55 -0500924 NLSR_LOG_DEBUG("Own Cor LSA, so refreshing it");
925 NLSR_LOG_DEBUG("Deleting Coordinate Lsa");
akmhoque2f423352014-06-03 11:49:35 -0500926 chkCorLsa->writeLog();
akmhoqueb6450b12014-04-24 00:01:03 -0500927 chkCorLsa->setLsSeqNo(chkCorLsa->getLsSeqNo() + 1);
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600928 if (m_confParam.getHyperbolicState() != HYPERBOLIC_STATE_OFF) {
Ashlesh Gawande3e105a02017-05-16 17:36:56 -0500929 m_sequencingManager.setCorLsaSeq(chkCorLsa->getLsSeqNo());
Nick Gordon5c467f02016-07-13 13:40:10 -0500930 }
931
akmhoquec7a79b22014-05-26 08:06:19 -0500932 chkCorLsa->setExpirationTimePoint(getLsaExpirationTimePoint());
dmcoomes5bcb39e2017-10-31 15:07:55 -0500933 NLSR_LOG_DEBUG("Adding Coordinate Lsa");
akmhoque2f423352014-06-03 11:49:35 -0500934 chkCorLsa->writeLog();
akmhoquefdbddb12014-05-02 18:35:19 -0500935 // schedule refreshing event again
akmhoque31d1d4b2014-05-05 22:08:14 -0500936 chkCorLsa->setExpiringEventId(scheduleCoordinateLsaExpiration(
937 chkCorLsa->getKey(),
938 chkCorLsa->getLsSeqNo(),
Alexander Afanasyev8388ec62014-08-16 18:38:57 -0700939 m_lsaRefreshTime));
Nick Gordon5c467f02016-07-13 13:40:10 -0500940 // Only sync coordinate LSAs if link-state routing is disabled
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600941 if (m_confParam.getHyperbolicState() != HYPERBOLIC_STATE_OFF) {
Ashlesh Gawande3e105a02017-05-16 17:36:56 -0500942 m_sequencingManager.writeSeqNoToFile();
Nick Gordon727d4832017-10-13 18:04:25 -0500943 m_sync.publishRoutingUpdate(Lsa::Type::COORDINATE, m_sequencingManager.getCorLsaSeq());
Nick Gordon5c467f02016-07-13 13:40:10 -0500944 }
akmhoque53353462014-04-22 08:43:45 -0500945 }
Nick G97e34942016-07-11 14:46:27 -0500946 // We can't refresh other router's LSAs, so we remove it.
akmhoque157b0a42014-05-13 00:26:37 -0500947 else {
dmcoomes5bcb39e2017-10-31 15:07:55 -0500948 NLSR_LOG_DEBUG("Other's Cor LSA, so removing from LSDB");
akmhoque31d1d4b2014-05-05 22:08:14 -0500949 removeCoordinateLsa(lsaKey);
akmhoque53353462014-04-22 08:43:45 -0500950 }
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600951 if (m_confParam.getHyperbolicState() == HYPERBOLIC_STATE_ON) {
952 m_routingTable.scheduleRoutingTableCalculation();
akmhoque53353462014-04-22 08:43:45 -0500953 }
954 }
955 }
956}
957
akmhoque53353462014-04-22 08:43:45 -0500958void
Alexander Afanasyev411ee4b2014-08-16 23:17:03 -0700959Lsdb::expressInterest(const ndn::Name& interestName, uint32_t timeoutCount,
Nick Gordone98480b2017-05-24 11:23:03 -0500960 ndn::time::steady_clock::TimePoint deadline)
akmhoque31d1d4b2014-05-05 22:08:14 -0500961{
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -0600962 // increment SENT_LSA_INTEREST
963 lsaIncrementSignal(Statistics::PacketType::SENT_LSA_INTEREST);
964
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500965 if (deadline == DEFAULT_LSA_RETRIEVAL_DEADLINE) {
Nick Gordone98480b2017-05-24 11:23:03 -0500966 deadline = ndn::time::steady_clock::now() + ndn::time::seconds(static_cast<int>(LSA_REFRESH_TIME_MAX));
Alexander Afanasyev411ee4b2014-08-16 23:17:03 -0700967 }
Nick G97e34942016-07-11 14:46:27 -0500968 // The first component of the interest is the name.
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500969 ndn::Name lsaName = interestName.getSubName(0, interestName.size()-1);
Nick G97e34942016-07-11 14:46:27 -0500970 // The seq no is the last
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500971 uint64_t seqNo = interestName[-1].toNumber();
972
Nick G97e34942016-07-11 14:46:27 -0500973 // If the LSA is not found in the list currently.
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500974 if (m_highestSeqNo.find(lsaName) == m_highestSeqNo.end()) {
975 m_highestSeqNo[lsaName] = seqNo;
976 }
Nick G97e34942016-07-11 14:46:27 -0500977 // If the new seq no is higher, that means the LSA is valid
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500978 else if (seqNo > m_highestSeqNo[lsaName]) {
979 m_highestSeqNo[lsaName] = seqNo;
980 }
Nick G97e34942016-07-11 14:46:27 -0500981 // Otherwise, its an old/invalid LSA
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500982 else if (seqNo < m_highestSeqNo[lsaName]) {
983 return;
984 }
985
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -0500986 ndn::Interest interest(interestName);
Ashlesh Gawande744e4812018-08-22 16:26:24 -0500987 ndn::util::SegmentFetcher::Options options;
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600988 options.interestLifetime = m_confParam.getLsaInterestLifetime();
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500989
dmcoomes5bcb39e2017-10-31 15:07:55 -0500990 NLSR_LOG_DEBUG("Fetching Data for LSA: " << interestName << " Seq number: " << seqNo);
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600991 auto fetcher = ndn::util::SegmentFetcher::start(m_face, interest,
992 m_confParam.getValidator(), options);
Ashlesh Gawande05cb7282018-08-30 14:39:41 -0500993
Ashlesh Gawande744e4812018-08-22 16:26:24 -0500994 auto it = m_fetchers.insert(fetcher).first;
995
996 fetcher->onComplete.connect([this, interestName, it] (ndn::ConstBufferPtr bufferPtr) {
997 afterFetchLsa(bufferPtr, interestName);
998 m_fetchers.erase(it);
999 });
1000
laqinfan7c13ba52018-01-15 21:17:24 +00001001 fetcher->onError.connect([this, interestName, timeoutCount, deadline, lsaName, seqNo, it]
Ashlesh Gawande744e4812018-08-22 16:26:24 -05001002 (uint32_t errorCode, const std::string& msg) {
1003 onFetchLsaError(errorCode, msg, interestName,
1004 timeoutCount, deadline, lsaName, seqNo);
1005 m_fetchers.erase(it);
1006 });
Muktadir Chowdhuryc3ea26f2018-01-05 21:40:59 +00001007
1008 m_lsaStorage.connectToFetcher(*fetcher);
Ashlesh Gawande85998a12017-12-07 22:22:13 -06001009 fetcher->afterSegmentValidated.connect([this] (const ndn::Data& data) {
1010 afterSegmentValidatedSignal(data);
1011 });
Muktadir Chowdhuryc3ea26f2018-01-05 21:40:59 +00001012
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -06001013 // increment a specific SENT_LSA_INTEREST
Nick Gordon727d4832017-10-13 18:04:25 -05001014 Lsa::Type lsaType;
1015 std::istringstream(interestName[-2].toUri()) >> lsaType;
1016 switch (lsaType) {
1017 case Lsa::Type::ADJACENCY:
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -06001018 lsaIncrementSignal(Statistics::PacketType::SENT_ADJ_LSA_INTEREST);
Nick Gordon727d4832017-10-13 18:04:25 -05001019 break;
1020 case Lsa::Type::COORDINATE:
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -06001021 lsaIncrementSignal(Statistics::PacketType::SENT_COORD_LSA_INTEREST);
Nick Gordon727d4832017-10-13 18:04:25 -05001022 break;
1023 case Lsa::Type::NAME:
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -06001024 lsaIncrementSignal(Statistics::PacketType::SENT_NAME_LSA_INTEREST);
Nick Gordon727d4832017-10-13 18:04:25 -05001025 break;
1026 default:
dmcoomes5bcb39e2017-10-31 15:07:55 -05001027 NLSR_LOG_ERROR("lsaType " << lsaType << " not recognized; failed Statistics::PacketType conversion");
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -06001028 }
akmhoque31d1d4b2014-05-05 22:08:14 -05001029}
1030
1031void
1032Lsdb::processInterest(const ndn::Name& name, const ndn::Interest& interest)
1033{
Ashlesh Gawande939b6f82018-12-09 16:51:09 -06001034 ndn::Name interestName(interest.getName());
1035 NLSR_LOG_DEBUG("Interest received for LSA: " << interestName);
1036
1037 if (interestName[-2].isVersion()) {
1038 // Interest for particular segment
1039 if (m_segmentPublisher.replyFromStore(interestName)) {
1040 NLSR_LOG_TRACE("Reply from SegmentPublisher storage");
1041 return;
1042 }
1043 // Remove version and segment
1044 interestName = interestName.getSubName(0, interestName.size() - 2);
1045 NLSR_LOG_TRACE("Interest w/o segment and version: " << interestName);
1046 }
1047
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -06001048 // increment RCV_LSA_INTEREST
1049 lsaIncrementSignal(Statistics::PacketType::RCV_LSA_INTEREST);
1050
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -05001051 std::string chkString("LSA");
Ashlesh Gawande939b6f82018-12-09 16:51:09 -06001052 int32_t lsaPosition = util::getNameComponentPosition(interestName, chkString);
Ashlesh Gawande5bf83172014-09-19 12:38:17 -05001053
Muktadir Chowdhuryc3ea26f2018-01-05 21:40:59 +00001054 // Forms the name of the router that the Interest packet came from.
Ashlesh Gawande85998a12017-12-07 22:22:13 -06001055 ndn::Name originRouter = m_confParam.getNetwork();
Muktadir Chowdhuryc3ea26f2018-01-05 21:40:59 +00001056 originRouter.append(interestName.getSubName(lsaPosition + 1,
Ashlesh Gawande939b6f82018-12-09 16:51:09 -06001057 interestName.size() - lsaPosition - 3));
Ashlesh Gawande5bf83172014-09-19 12:38:17 -05001058
Muktadir Chowdhuryc3ea26f2018-01-05 21:40:59 +00001059 // if the interest is for this router's LSA
Ashlesh Gawande85998a12017-12-07 22:22:13 -06001060 if (originRouter == m_confParam.getRouterPrefix() && lsaPosition >= 0) {
Ashlesh Gawande939b6f82018-12-09 16:51:09 -06001061 uint64_t seqNo = interestName[-1].toNumber();
1062 NLSR_LOG_DEBUG("LSA sequence number from interest: " << seqNo);
Ashlesh Gawande5bf83172014-09-19 12:38:17 -05001063
Ashlesh Gawande939b6f82018-12-09 16:51:09 -06001064 std::string lsaType = interestName[-2].toUri();
1065 Lsa::Type interestedLsType;
1066 std::istringstream(lsaType) >> interestedLsType;
Ashlesh Gawande5bf83172014-09-19 12:38:17 -05001067
Ashlesh Gawande939b6f82018-12-09 16:51:09 -06001068 if (interestedLsType == Lsa::Type::NAME) {
1069 processInterestForNameLsa(interest, originRouter.append(lsaType), seqNo);
akmhoque31d1d4b2014-05-05 22:08:14 -05001070 }
Ashlesh Gawande939b6f82018-12-09 16:51:09 -06001071 else if (interestedLsType == Lsa::Type::ADJACENCY) {
1072 processInterestForAdjacencyLsa(interest, originRouter.append(lsaType), seqNo);
1073 }
1074 else if (interestedLsType == Lsa::Type::COORDINATE) {
1075 processInterestForCoordinateLsa(interest, originRouter.append(lsaType), seqNo);
1076 }
1077 else {
1078 NLSR_LOG_WARN("Received unrecognized LSA type: " << interestedLsType);
1079 }
1080 lsaIncrementSignal(Statistics::PacketType::SENT_LSA_DATA);
Muktadir Chowdhuryc3ea26f2018-01-05 21:40:59 +00001081 }
1082 else { // else the interest is for other router's lsa, serve from LsaSegmentStorage
1083 const ndn::Data* lsaSegment = m_lsaStorage.getLsaSegment(interest);
1084 if (lsaSegment != nullptr) {
1085 NLSR_LOG_TRACE("Found data in lsa storage. Sending the data for " << interest.getName());
Ashlesh Gawande85998a12017-12-07 22:22:13 -06001086 m_face.put(*lsaSegment);
akmhoque31d1d4b2014-05-05 22:08:14 -05001087 }
akmhoque157b0a42014-05-13 00:26:37 -05001088 else {
Ashlesh Gawande939b6f82018-12-09 16:51:09 -06001089 NLSR_LOG_TRACE(interest << " was not found in this lsa storage.");
akmhoque31d1d4b2014-05-05 22:08:14 -05001090 }
1091 }
1092}
1093
Nick G97e34942016-07-11 14:46:27 -05001094 // \brief Finds and sends a requested name LSA.
1095 // \param interest The interest that seeks the name LSA.
1096 // \param lsaKey The LSA that the Interest is seeking.
1097 // \param seqNo A sequence number to ensure that we are sending the
1098 // version that was requested.
akmhoque69c9aa92014-07-23 15:15:05 -05001099void
akmhoque31d1d4b2014-05-05 22:08:14 -05001100Lsdb::processInterestForNameLsa(const ndn::Interest& interest,
1101 const ndn::Name& lsaKey,
Ashlesh Gawande5bf83172014-09-19 12:38:17 -05001102 uint64_t seqNo)
akmhoque31d1d4b2014-05-05 22:08:14 -05001103{
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -06001104 // increment RCV_NAME_LSA_INTEREST
1105 lsaIncrementSignal(Statistics::PacketType::RCV_NAME_LSA_INTEREST);
dmcoomes5bcb39e2017-10-31 15:07:55 -05001106 NLSR_LOG_DEBUG("nameLsa interest " << interest << " received");
Ashlesh Gawande85998a12017-12-07 22:22:13 -06001107 NameLsa* nameLsa = findNameLsa(lsaKey);
dmcoomescf8d0ed2017-02-21 11:39:01 -06001108 if (nameLsa != nullptr) {
1109 NLSR_LOG_TRACE("Verifying SeqNo for NameLsa is same as requested.");
Ashlesh Gawande5bf83172014-09-19 12:38:17 -05001110 if (nameLsa->getLsSeqNo() == seqNo) {
Nick Gordonfaf49f42017-10-23 12:36:28 -05001111 std::string content = nameLsa->serialize();
Ashlesh Gawande939b6f82018-12-09 16:51:09 -06001112 m_segmentPublisher.publish(interest.getName(), interest.getName(),
1113 ndn::encoding::makeStringBlock(ndn::tlv::Content, content),
Ashlesh Gawande85998a12017-12-07 22:22:13 -06001114 m_lsaRefreshTime, m_signingInfo);
Muktadir Chowdhuryc3ea26f2018-01-05 21:40:59 +00001115
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -06001116 lsaIncrementSignal(Statistics::PacketType::SENT_NAME_LSA_DATA);
akmhoque31d1d4b2014-05-05 22:08:14 -05001117 }
dmcoomes9eaf3f42017-02-21 11:39:01 -06001118 else {
dmcoomes5bcb39e2017-10-31 15:07:55 -05001119 NLSR_LOG_TRACE("SeqNo for nameLsa does not match");
dmcoomes9eaf3f42017-02-21 11:39:01 -06001120 }
1121 }
1122 else {
dmcoomes5bcb39e2017-10-31 15:07:55 -05001123 NLSR_LOG_TRACE(interest << " was not found in this lsdb");
akmhoque31d1d4b2014-05-05 22:08:14 -05001124 }
1125}
1126
Nick G97e34942016-07-11 14:46:27 -05001127 // \brief Finds and sends a requested adj. LSA.
1128 // \param interest The interest that seeks the adj. LSA.
1129 // \param lsaKey The LSA that the Interest is seeking.
1130 // \param seqNo A sequence number to ensure that we are sending the
1131 // version that was requested.
akmhoque31d1d4b2014-05-05 22:08:14 -05001132void
1133Lsdb::processInterestForAdjacencyLsa(const ndn::Interest& interest,
1134 const ndn::Name& lsaKey,
Ashlesh Gawande5bf83172014-09-19 12:38:17 -05001135 uint64_t seqNo)
akmhoque31d1d4b2014-05-05 22:08:14 -05001136{
Ashlesh Gawande85998a12017-12-07 22:22:13 -06001137 if (m_confParam.getHyperbolicState() == HYPERBOLIC_STATE_ON) {
dmcoomes5bcb39e2017-10-31 15:07:55 -05001138 NLSR_LOG_ERROR("Received interest for an adjacency LSA when hyperbolic routing is enabled");
Nick Gordon5c467f02016-07-13 13:40:10 -05001139 }
1140
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -06001141 lsaIncrementSignal(Statistics::PacketType::RCV_ADJ_LSA_INTEREST);
dmcoomes5bcb39e2017-10-31 15:07:55 -05001142 NLSR_LOG_DEBUG("AdjLsa interest " << interest << " received");
Ashlesh Gawande85998a12017-12-07 22:22:13 -06001143 AdjLsa* adjLsa = findAdjLsa(lsaKey);
dmcoomescf8d0ed2017-02-21 11:39:01 -06001144 if (adjLsa != nullptr) {
1145 NLSR_LOG_TRACE("Verifying SeqNo for AdjLsa is same as requested.");
Ashlesh Gawande5bf83172014-09-19 12:38:17 -05001146 if (adjLsa->getLsSeqNo() == seqNo) {
Nick Gordonfaf49f42017-10-23 12:36:28 -05001147 std::string content = adjLsa->serialize();
Ashlesh Gawande939b6f82018-12-09 16:51:09 -06001148 m_segmentPublisher.publish(interest.getName(), interest.getName(),
1149 ndn::encoding::makeStringBlock(ndn::tlv::Content, content),
Ashlesh Gawande85998a12017-12-07 22:22:13 -06001150 m_lsaRefreshTime, m_signingInfo);
Ashlesh Gawande939b6f82018-12-09 16:51:09 -06001151
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -06001152 lsaIncrementSignal(Statistics::PacketType::SENT_ADJ_LSA_DATA);
akmhoque31d1d4b2014-05-05 22:08:14 -05001153 }
dmcoomes9eaf3f42017-02-21 11:39:01 -06001154 else {
dmcoomes5bcb39e2017-10-31 15:07:55 -05001155 NLSR_LOG_TRACE("SeqNo for AdjLsa does not match");
dmcoomes9eaf3f42017-02-21 11:39:01 -06001156 }
1157 }
1158 else {
dmcoomes5bcb39e2017-10-31 15:07:55 -05001159 NLSR_LOG_TRACE(interest << " was not found in this lsdb");
akmhoque31d1d4b2014-05-05 22:08:14 -05001160 }
1161}
1162
Nick G97e34942016-07-11 14:46:27 -05001163 // \brief Finds and sends a requested cor. LSA.
1164 // \param interest The interest that seeks the cor. LSA.
1165 // \param lsaKey The LSA that the Interest is seeking.
1166 // \param seqNo A sequence number to ensure that we are sending the
1167 // version that was requested.
akmhoque31d1d4b2014-05-05 22:08:14 -05001168void
1169Lsdb::processInterestForCoordinateLsa(const ndn::Interest& interest,
1170 const ndn::Name& lsaKey,
Ashlesh Gawande5bf83172014-09-19 12:38:17 -05001171 uint64_t seqNo)
akmhoque31d1d4b2014-05-05 22:08:14 -05001172{
Ashlesh Gawande85998a12017-12-07 22:22:13 -06001173 if (m_confParam.getHyperbolicState() == HYPERBOLIC_STATE_OFF) {
dmcoomes5bcb39e2017-10-31 15:07:55 -05001174 NLSR_LOG_ERROR("Received Interest for a coordinate LSA when link-state routing is enabled");
Nick Gordon5c467f02016-07-13 13:40:10 -05001175 }
1176
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -06001177 lsaIncrementSignal(Statistics::PacketType::RCV_COORD_LSA_INTEREST);
dmcoomes5bcb39e2017-10-31 15:07:55 -05001178 NLSR_LOG_DEBUG("CoordinateLsa interest " << interest << " received");
Ashlesh Gawande85998a12017-12-07 22:22:13 -06001179 CoordinateLsa* corLsa = findCoordinateLsa(lsaKey);
dmcoomescf8d0ed2017-02-21 11:39:01 -06001180 if (corLsa != nullptr) {
1181 NLSR_LOG_TRACE("Verifying SeqNo for CoordinateLsa is same as requested.");
Ashlesh Gawande5bf83172014-09-19 12:38:17 -05001182 if (corLsa->getLsSeqNo() == seqNo) {
Nick Gordonfaf49f42017-10-23 12:36:28 -05001183 std::string content = corLsa->serialize();
Ashlesh Gawande939b6f82018-12-09 16:51:09 -06001184 m_segmentPublisher.publish(interest.getName(), interest.getName(),
1185 ndn::encoding::makeStringBlock(ndn::tlv::Content, content),
Ashlesh Gawande85998a12017-12-07 22:22:13 -06001186 m_lsaRefreshTime, m_signingInfo);
Ashlesh Gawande939b6f82018-12-09 16:51:09 -06001187
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -06001188 lsaIncrementSignal(Statistics::PacketType::SENT_COORD_LSA_DATA);
akmhoque31d1d4b2014-05-05 22:08:14 -05001189 }
dmcoomes9eaf3f42017-02-21 11:39:01 -06001190 else {
dmcoomes5bcb39e2017-10-31 15:07:55 -05001191 NLSR_LOG_TRACE("SeqNo for CoordinateLsa does not match");
dmcoomes9eaf3f42017-02-21 11:39:01 -06001192 }
1193 }
1194 else {
dmcoomes5bcb39e2017-10-31 15:07:55 -05001195 NLSR_LOG_TRACE(interest << " was not found in this lsdb");
akmhoque31d1d4b2014-05-05 22:08:14 -05001196 }
1197}
1198
1199void
dmcoomes9f936662017-03-02 10:33:09 -06001200Lsdb::onContentValidated(const std::shared_ptr<const ndn::Data>& data)
Yingdi Yu20e3a6e2014-05-26 23:16:10 -07001201{
1202 const ndn::Name& dataName = data->getName();
dmcoomes5bcb39e2017-10-31 15:07:55 -05001203 NLSR_LOG_DEBUG("Data validation successful for LSA: " << dataName);
Ashlesh Gawande5bf83172014-09-19 12:38:17 -05001204
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -05001205 std::string chkString("LSA");
akmhoque31d1d4b2014-05-05 22:08:14 -05001206 int32_t lsaPosition = util::getNameComponentPosition(dataName, chkString);
Ashlesh Gawande5bf83172014-09-19 12:38:17 -05001207
akmhoque157b0a42014-05-13 00:26:37 -05001208 if (lsaPosition >= 0) {
Ashlesh Gawande5bf83172014-09-19 12:38:17 -05001209
Nick G97e34942016-07-11 14:46:27 -05001210 // Extracts the prefix of the originating router from the data.
Ashlesh Gawande85998a12017-12-07 22:22:13 -06001211 ndn::Name originRouter = m_confParam.getNetwork();
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -05001212 originRouter.append(dataName.getSubName(lsaPosition + 1, dataName.size() - lsaPosition - 3));
Ashlesh Gawande5bf83172014-09-19 12:38:17 -05001213
Muktadir R Chowdhuryaa3b0852015-08-06 13:08:56 -05001214 uint64_t seqNo = dataName[-1].toNumber();
Ashlesh Gawande820bb662017-08-03 16:12:07 -05001215 std::string dataContent(reinterpret_cast<const char*>(data->getContent().value()),
1216 data->getContent().value_size());
Ashlesh Gawande5bf83172014-09-19 12:38:17 -05001217
Nick Gordon727d4832017-10-13 18:04:25 -05001218 Lsa::Type interestedLsType;
1219 std::istringstream(dataName[-2].toUri()) >> interestedLsType;
Ashlesh Gawande5bf83172014-09-19 12:38:17 -05001220
Nick Gordon727d4832017-10-13 18:04:25 -05001221 if (interestedLsType == Lsa::Type::NAME) {
1222 processContentNameLsa(originRouter.append(std::to_string(interestedLsType)), seqNo,
1223 dataContent);
akmhoque31d1d4b2014-05-05 22:08:14 -05001224 }
Nick Gordon727d4832017-10-13 18:04:25 -05001225 else if (interestedLsType == Lsa::Type::ADJACENCY) {
1226 processContentAdjacencyLsa(originRouter.append(std::to_string(interestedLsType)), seqNo,
1227 dataContent);
akmhoque31d1d4b2014-05-05 22:08:14 -05001228 }
Nick Gordon727d4832017-10-13 18:04:25 -05001229 else if (interestedLsType == Lsa::Type::COORDINATE) {
1230 processContentCoordinateLsa(originRouter.append(std::to_string(interestedLsType)), seqNo,
1231 dataContent);
akmhoque31d1d4b2014-05-05 22:08:14 -05001232 }
akmhoque157b0a42014-05-13 00:26:37 -05001233 else {
dmcoomes5bcb39e2017-10-31 15:07:55 -05001234 NLSR_LOG_WARN("Received unrecognized LSA Type: " << interestedLsType);
akmhoque31d1d4b2014-05-05 22:08:14 -05001235 }
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -06001236
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -06001237 lsaIncrementSignal(Statistics::PacketType::RCV_LSA_DATA);
akmhoque31d1d4b2014-05-05 22:08:14 -05001238 }
1239}
1240
1241void
1242Lsdb::processContentNameLsa(const ndn::Name& lsaKey,
Ashlesh Gawande5bf83172014-09-19 12:38:17 -05001243 uint64_t lsSeqNo, std::string& dataContent)
akmhoque31d1d4b2014-05-05 22:08:14 -05001244{
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -06001245 lsaIncrementSignal(Statistics::PacketType::RCV_NAME_LSA_DATA);
akmhoque157b0a42014-05-13 00:26:37 -05001246 if (isNameLsaNew(lsaKey, lsSeqNo)) {
akmhoque31d1d4b2014-05-05 22:08:14 -05001247 NameLsa nameLsa;
Nick Gordon0fa4c772017-10-23 13:33:03 -05001248 if (nameLsa.deserialize(dataContent)) {
akmhoque31d1d4b2014-05-05 22:08:14 -05001249 installNameLsa(nameLsa);
1250 }
akmhoque157b0a42014-05-13 00:26:37 -05001251 else {
dmcoomes5bcb39e2017-10-31 15:07:55 -05001252 NLSR_LOG_DEBUG("LSA data decoding error :(");
akmhoque31d1d4b2014-05-05 22:08:14 -05001253 }
1254 }
1255}
1256
1257void
1258Lsdb::processContentAdjacencyLsa(const ndn::Name& lsaKey,
Ashlesh Gawande5bf83172014-09-19 12:38:17 -05001259 uint64_t lsSeqNo, std::string& dataContent)
akmhoque31d1d4b2014-05-05 22:08:14 -05001260{
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -06001261 lsaIncrementSignal(Statistics::PacketType::RCV_ADJ_LSA_DATA);
akmhoque157b0a42014-05-13 00:26:37 -05001262 if (isAdjLsaNew(lsaKey, lsSeqNo)) {
akmhoque31d1d4b2014-05-05 22:08:14 -05001263 AdjLsa adjLsa;
Nick Gordon0fa4c772017-10-23 13:33:03 -05001264 if (adjLsa.deserialize(dataContent)) {
akmhoque31d1d4b2014-05-05 22:08:14 -05001265 installAdjLsa(adjLsa);
1266 }
akmhoque157b0a42014-05-13 00:26:37 -05001267 else {
dmcoomes5bcb39e2017-10-31 15:07:55 -05001268 NLSR_LOG_DEBUG("LSA data decoding error :(");
akmhoque31d1d4b2014-05-05 22:08:14 -05001269 }
1270 }
1271}
1272
1273void
1274Lsdb::processContentCoordinateLsa(const ndn::Name& lsaKey,
Ashlesh Gawande5bf83172014-09-19 12:38:17 -05001275 uint64_t lsSeqNo, std::string& dataContent)
akmhoque31d1d4b2014-05-05 22:08:14 -05001276{
Alejandro Gil Torrese0d20482016-03-06 23:56:19 -06001277 lsaIncrementSignal(Statistics::PacketType::RCV_COORD_LSA_DATA);
akmhoque157b0a42014-05-13 00:26:37 -05001278 if (isCoordinateLsaNew(lsaKey, lsSeqNo)) {
akmhoque31d1d4b2014-05-05 22:08:14 -05001279 CoordinateLsa corLsa;
Nick Gordon0fa4c772017-10-23 13:33:03 -05001280 if (corLsa.deserialize(dataContent)) {
akmhoque31d1d4b2014-05-05 22:08:14 -05001281 installCoordinateLsa(corLsa);
1282 }
akmhoque157b0a42014-05-13 00:26:37 -05001283 else {
dmcoomes5bcb39e2017-10-31 15:07:55 -05001284 NLSR_LOG_DEBUG("LSA data decoding error :(");
akmhoque31d1d4b2014-05-05 22:08:14 -05001285 }
1286 }
1287}
1288
akmhoquec7a79b22014-05-26 08:06:19 -05001289ndn::time::system_clock::TimePoint
1290Lsdb::getLsaExpirationTimePoint()
1291{
1292 ndn::time::system_clock::TimePoint expirationTimePoint = ndn::time::system_clock::now();
1293 expirationTimePoint = expirationTimePoint +
Ashlesh Gawande85998a12017-12-07 22:22:13 -06001294 ndn::time::seconds(m_confParam.getRouterDeadInterval());
akmhoquec7a79b22014-05-26 08:06:19 -05001295 return expirationTimePoint;
1296}
akmhoque31d1d4b2014-05-05 22:08:14 -05001297
1298void
akmhoque2f423352014-06-03 11:49:35 -05001299Lsdb::writeAdjLsdbLog()
akmhoque53353462014-04-22 08:43:45 -05001300{
dmcoomes5bcb39e2017-10-31 15:07:55 -05001301 NLSR_LOG_DEBUG("---------------Adj LSDB-------------------");
Ashlesh Gawandee8d8bd52018-08-09 17:18:51 -05001302 for (const auto& adj : m_adjLsdb) {
1303 adj.writeLog();
akmhoque53353462014-04-22 08:43:45 -05001304 }
1305}
1306
1307//-----utility function -----
1308bool
Nick Gordon727d4832017-10-13 18:04:25 -05001309Lsdb::doesLsaExist(const ndn::Name& key, const Lsa::Type& lsType)
akmhoque53353462014-04-22 08:43:45 -05001310{
Nick Gordon727d4832017-10-13 18:04:25 -05001311 switch (lsType) {
1312 case Lsa::Type::ADJACENCY:
akmhoque53353462014-04-22 08:43:45 -05001313 return doesAdjLsaExist(key);
Nick Gordon727d4832017-10-13 18:04:25 -05001314 case Lsa::Type::COORDINATE:
akmhoqueb6450b12014-04-24 00:01:03 -05001315 return doesCoordinateLsaExist(key);
Nick Gordon727d4832017-10-13 18:04:25 -05001316 case Lsa::Type::NAME:
1317 return doesNameLsaExist(key);
1318 default:
1319 return false;
akmhoque53353462014-04-22 08:43:45 -05001320 }
akmhoque53353462014-04-22 08:43:45 -05001321}
1322
Nick Gordon8f23b5d2017-08-31 17:53:07 -05001323bool
Nick Gordon727d4832017-10-13 18:04:25 -05001324Lsdb::isLsaNew(const ndn::Name& routerName, const Lsa::Type& lsaType,
Nick Gordon8f23b5d2017-08-31 17:53:07 -05001325 const uint64_t& sequenceNumber) {
1326 ndn::Name lsaKey = routerName;
Nick Gordon727d4832017-10-13 18:04:25 -05001327 lsaKey.append(std::to_string(lsaType));
Nick Gordon8f23b5d2017-08-31 17:53:07 -05001328
Nick Gordon727d4832017-10-13 18:04:25 -05001329 switch (lsaType) {
1330 case Lsa::Type::ADJACENCY:
Nick Gordon8f23b5d2017-08-31 17:53:07 -05001331 return isAdjLsaNew(lsaKey, sequenceNumber);
Nick Gordon727d4832017-10-13 18:04:25 -05001332 case Lsa::Type::COORDINATE:
Nick Gordon8f23b5d2017-08-31 17:53:07 -05001333 return isCoordinateLsaNew(lsaKey, sequenceNumber);
Nick Gordon727d4832017-10-13 18:04:25 -05001334 case Lsa::Type::NAME:
1335 return isNameLsaNew(lsaKey, sequenceNumber);
1336 default:
Nick Gordon8f23b5d2017-08-31 17:53:07 -05001337 return false;
1338 }
1339}
1340
Alexander Afanasyev8388ec62014-08-16 18:38:57 -07001341} // namespace nlsr