blob: 79fbd82708831d571e59039648f3797e46fd782f [file] [log] [blame]
akmhoque3d06e792014-05-27 16:23:20 -05001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Vince Lehmanc2e51f62015-01-20 15:03:11 -06003 * Copyright (c) 2014-2015, The University of Memphis,
4 * 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 <string>
23#include <utility>
akmhoque157b0a42014-05-13 00:26:37 -050024
akmhoque53353462014-04-22 08:43:45 -050025#include "lsdb.hpp"
26#include "nlsr.hpp"
akmhoque157b0a42014-05-13 00:26:37 -050027#include "conf-parameter.hpp"
akmhoque31d1d4b2014-05-05 22:08:14 -050028#include "utility/name-helper.hpp"
akmhoque674b0b12014-05-20 14:33:28 -050029#include "logger.hpp"
akmhoque53353462014-04-22 08:43:45 -050030
31namespace nlsr {
32
akmhoque674b0b12014-05-20 14:33:28 -050033INIT_LOGGER("Lsdb");
34
Vince Lehman18841082014-08-19 17:15:24 -050035const ndn::time::seconds Lsdb::GRACE_PERIOD = ndn::time::seconds(10);
Ashlesh Gawande5bf83172014-09-19 12:38:17 -050036const steady_clock::TimePoint Lsdb::DEFAULT_LSA_RETRIEVAL_DEADLINE = steady_clock::TimePoint::min();
Vince Lehman18841082014-08-19 17:15:24 -050037
akmhoque53353462014-04-22 08:43:45 -050038using namespace std;
39
40void
akmhoque31d1d4b2014-05-05 22:08:14 -050041Lsdb::cancelScheduleLsaExpiringEvent(ndn::EventId eid)
akmhoque53353462014-04-22 08:43:45 -050042{
Vince Lehman7c603292014-09-11 17:48:16 -050043 m_scheduler.cancelEvent(eid);
akmhoque53353462014-04-22 08:43:45 -050044}
45
46static bool
akmhoque31d1d4b2014-05-05 22:08:14 -050047nameLsaCompareByKey(const NameLsa& nlsa1, const ndn::Name& key)
akmhoque53353462014-04-22 08:43:45 -050048{
49 return nlsa1.getKey() == key;
50}
51
52
53bool
akmhoque31d1d4b2014-05-05 22:08:14 -050054Lsdb::buildAndInstallOwnNameLsa()
akmhoque53353462014-04-22 08:43:45 -050055{
akmhoque31d1d4b2014-05-05 22:08:14 -050056 NameLsa nameLsa(m_nlsr.getConfParameter().getRouterPrefix(),
alvy49b1c0c2014-12-19 13:57:46 -060057 NameLsa::TYPE_STRING,
akmhoque31d1d4b2014-05-05 22:08:14 -050058 m_nlsr.getSequencingManager().getNameLsaSeq() + 1,
akmhoquec7a79b22014-05-26 08:06:19 -050059 getLsaExpirationTimePoint(),
akmhoque31d1d4b2014-05-05 22:08:14 -050060 m_nlsr.getNamePrefixList());
61 m_nlsr.getSequencingManager().increaseNameLsaSeq();
62 return installNameLsa(nameLsa);
akmhoque53353462014-04-22 08:43:45 -050063}
64
akmhoqueb6450b12014-04-24 00:01:03 -050065NameLsa*
akmhoque31d1d4b2014-05-05 22:08:14 -050066Lsdb::findNameLsa(const ndn::Name& key)
akmhoque53353462014-04-22 08:43:45 -050067{
68 std::list<NameLsa>::iterator it = std::find_if(m_nameLsdb.begin(),
69 m_nameLsdb.end(),
70 bind(nameLsaCompareByKey, _1, key));
akmhoque157b0a42014-05-13 00:26:37 -050071 if (it != m_nameLsdb.end()) {
akmhoqueb6450b12014-04-24 00:01:03 -050072 return &(*it);
akmhoque53353462014-04-22 08:43:45 -050073 }
akmhoqueb6450b12014-04-24 00:01:03 -050074 return 0;
akmhoque53353462014-04-22 08:43:45 -050075}
76
77bool
akmhoque31d1d4b2014-05-05 22:08:14 -050078Lsdb::isNameLsaNew(const ndn::Name& key, uint64_t seqNo)
akmhoque53353462014-04-22 08:43:45 -050079{
akmhoqueb6450b12014-04-24 00:01:03 -050080 NameLsa* nameLsaCheck = findNameLsa(key);
akmhoque157b0a42014-05-13 00:26:37 -050081 if (nameLsaCheck != 0) {
82 if (nameLsaCheck->getLsSeqNo() < seqNo) {
akmhoque53353462014-04-22 08:43:45 -050083 return true;
84 }
akmhoque157b0a42014-05-13 00:26:37 -050085 else {
akmhoque53353462014-04-22 08:43:45 -050086 return false;
87 }
88 }
89 return true;
90}
91
92ndn::EventId
akmhoquec7a79b22014-05-26 08:06:19 -050093Lsdb::scheduleNameLsaExpiration(const ndn::Name& key, int seqNo,
94 const ndn::time::seconds& expTime)
akmhoque53353462014-04-22 08:43:45 -050095{
Vince Lehman7c603292014-09-11 17:48:16 -050096 return m_scheduler.scheduleEvent(expTime + GRACE_PERIOD,
97 ndn::bind(&Lsdb::exprireOrRefreshNameLsa, this, key, seqNo));
akmhoque53353462014-04-22 08:43:45 -050098}
99
100bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500101Lsdb::installNameLsa(NameLsa& nlsa)
akmhoque53353462014-04-22 08:43:45 -0500102{
Alexander Afanasyev8388ec62014-08-16 18:38:57 -0700103 ndn::time::seconds timeToExpire = m_lsaRefreshTime;
akmhoqueb6450b12014-04-24 00:01:03 -0500104 NameLsa* chkNameLsa = findNameLsa(nlsa.getKey());
akmhoque157b0a42014-05-13 00:26:37 -0500105 if (chkNameLsa == 0) {
akmhoque53353462014-04-22 08:43:45 -0500106 addNameLsa(nlsa);
akmhoque2f423352014-06-03 11:49:35 -0500107 _LOG_DEBUG("New Name LSA");
108 _LOG_DEBUG("Adding Name Lsa");
akmhoque53353462014-04-22 08:43:45 -0500109 nlsa.writeLog();
akmhoque674b0b12014-05-20 14:33:28 -0500110
akmhoque157b0a42014-05-13 00:26:37 -0500111 if (nlsa.getOrigRouter() != m_nlsr.getConfParameter().getRouterPrefix()) {
akmhoque31d1d4b2014-05-05 22:08:14 -0500112 m_nlsr.getNamePrefixTable().addEntry(nlsa.getOrigRouter(),
113 nlsa.getOrigRouter());
114 std::list<ndn::Name> nameList = nlsa.getNpl().getNameList();
115 for (std::list<ndn::Name>::iterator it = nameList.begin(); it != nameList.end();
akmhoque157b0a42014-05-13 00:26:37 -0500116 it++) {
117 if ((*it) != m_nlsr.getConfParameter().getRouterPrefix()) {
akmhoque31d1d4b2014-05-05 22:08:14 -0500118 m_nlsr.getNamePrefixTable().addEntry((*it), nlsa.getOrigRouter());
akmhoque53353462014-04-22 08:43:45 -0500119 }
120 }
121 }
akmhoque157b0a42014-05-13 00:26:37 -0500122 if (nlsa.getOrigRouter() != m_nlsr.getConfParameter().getRouterPrefix()) {
akmhoquec7a79b22014-05-26 08:06:19 -0500123 ndn::time::system_clock::Duration duration = nlsa.getExpirationTimePoint() -
124 ndn::time::system_clock::now();
125 timeToExpire = ndn::time::duration_cast<ndn::time::seconds>(duration);
akmhoque53353462014-04-22 08:43:45 -0500126 }
akmhoque31d1d4b2014-05-05 22:08:14 -0500127 nlsa.setExpiringEventId(scheduleNameLsaExpiration(nlsa.getKey(),
akmhoque53353462014-04-22 08:43:45 -0500128 nlsa.getLsSeqNo(),
129 timeToExpire));
130 }
akmhoque157b0a42014-05-13 00:26:37 -0500131 else {
132 if (chkNameLsa->getLsSeqNo() < nlsa.getLsSeqNo()) {
akmhoque674b0b12014-05-20 14:33:28 -0500133 _LOG_DEBUG("Updated Name LSA. Updating LSDB");
akmhoque2f423352014-06-03 11:49:35 -0500134 _LOG_DEBUG("Deleting Name Lsa");
akmhoqueb6450b12014-04-24 00:01:03 -0500135 chkNameLsa->writeLog();
136 chkNameLsa->setLsSeqNo(nlsa.getLsSeqNo());
akmhoquec7a79b22014-05-26 08:06:19 -0500137 chkNameLsa->setExpirationTimePoint(nlsa.getExpirationTimePoint());
akmhoqueb6450b12014-04-24 00:01:03 -0500138 chkNameLsa->getNpl().sort();
akmhoque53353462014-04-22 08:43:45 -0500139 nlsa.getNpl().sort();
akmhoque31d1d4b2014-05-05 22:08:14 -0500140 std::list<ndn::Name> nameToAdd;
akmhoque53353462014-04-22 08:43:45 -0500141 std::set_difference(nlsa.getNpl().getNameList().begin(),
142 nlsa.getNpl().getNameList().end(),
akmhoqueb6450b12014-04-24 00:01:03 -0500143 chkNameLsa->getNpl().getNameList().begin(),
144 chkNameLsa->getNpl().getNameList().end(),
akmhoque53353462014-04-22 08:43:45 -0500145 std::inserter(nameToAdd, nameToAdd.begin()));
akmhoque31d1d4b2014-05-05 22:08:14 -0500146 for (std::list<ndn::Name>::iterator it = nameToAdd.begin();
akmhoque157b0a42014-05-13 00:26:37 -0500147 it != nameToAdd.end(); ++it) {
akmhoqueb6450b12014-04-24 00:01:03 -0500148 chkNameLsa->addName((*it));
akmhoque157b0a42014-05-13 00:26:37 -0500149 if (nlsa.getOrigRouter() != m_nlsr.getConfParameter().getRouterPrefix()) {
150 if ((*it) != m_nlsr.getConfParameter().getRouterPrefix()) {
akmhoque31d1d4b2014-05-05 22:08:14 -0500151 m_nlsr.getNamePrefixTable().addEntry((*it), nlsa.getOrigRouter());
akmhoque53353462014-04-22 08:43:45 -0500152 }
153 }
154 }
Vince Lehmanf1aa5232014-10-06 17:57:35 -0500155
156 chkNameLsa->getNpl().sort();
157
akmhoque31d1d4b2014-05-05 22:08:14 -0500158 std::list<ndn::Name> nameToRemove;
akmhoqueb6450b12014-04-24 00:01:03 -0500159 std::set_difference(chkNameLsa->getNpl().getNameList().begin(),
160 chkNameLsa->getNpl().getNameList().end(),
akmhoque53353462014-04-22 08:43:45 -0500161 nlsa.getNpl().getNameList().begin(),
162 nlsa.getNpl().getNameList().end(),
163 std::inserter(nameToRemove, nameToRemove.begin()));
akmhoque31d1d4b2014-05-05 22:08:14 -0500164 for (std::list<ndn::Name>::iterator it = nameToRemove.begin();
akmhoque157b0a42014-05-13 00:26:37 -0500165 it != nameToRemove.end(); ++it) {
akmhoqueb6450b12014-04-24 00:01:03 -0500166 chkNameLsa->removeName((*it));
akmhoque157b0a42014-05-13 00:26:37 -0500167 if (nlsa.getOrigRouter() != m_nlsr.getConfParameter().getRouterPrefix()) {
168 if ((*it) != m_nlsr.getConfParameter().getRouterPrefix()) {
akmhoque31d1d4b2014-05-05 22:08:14 -0500169 m_nlsr.getNamePrefixTable().removeEntry((*it), nlsa.getOrigRouter());
akmhoque53353462014-04-22 08:43:45 -0500170 }
171 }
172 }
akmhoque157b0a42014-05-13 00:26:37 -0500173 if (nlsa.getOrigRouter() != m_nlsr.getConfParameter().getRouterPrefix()) {
akmhoquec7a79b22014-05-26 08:06:19 -0500174 ndn::time::system_clock::Duration duration = nlsa.getExpirationTimePoint() -
175 ndn::time::system_clock::now();
176 timeToExpire = ndn::time::duration_cast<ndn::time::seconds>(duration);
akmhoque53353462014-04-22 08:43:45 -0500177 }
akmhoque31d1d4b2014-05-05 22:08:14 -0500178 cancelScheduleLsaExpiringEvent(chkNameLsa->getExpiringEventId());
179 chkNameLsa->setExpiringEventId(scheduleNameLsaExpiration(nlsa.getKey(),
akmhoqueb6450b12014-04-24 00:01:03 -0500180 nlsa.getLsSeqNo(),
181 timeToExpire));
akmhoque2f423352014-06-03 11:49:35 -0500182 _LOG_DEBUG("Adding Name Lsa");
akmhoqueb6450b12014-04-24 00:01:03 -0500183 chkNameLsa->writeLog();
akmhoque53353462014-04-22 08:43:45 -0500184 }
185 }
186 return true;
187}
188
189bool
190Lsdb::addNameLsa(NameLsa& nlsa)
191{
192 std::list<NameLsa>::iterator it = std::find_if(m_nameLsdb.begin(),
193 m_nameLsdb.end(),
194 bind(nameLsaCompareByKey, _1,
195 nlsa.getKey()));
akmhoque157b0a42014-05-13 00:26:37 -0500196 if (it == m_nameLsdb.end()) {
akmhoque53353462014-04-22 08:43:45 -0500197 m_nameLsdb.push_back(nlsa);
198 return true;
199 }
200 return false;
201}
202
203bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500204Lsdb::removeNameLsa(const ndn::Name& key)
akmhoque53353462014-04-22 08:43:45 -0500205{
206 std::list<NameLsa>::iterator it = std::find_if(m_nameLsdb.begin(),
207 m_nameLsdb.end(),
akmhoque157b0a42014-05-13 00:26:37 -0500208 ndn::bind(nameLsaCompareByKey, _1, key));
209 if (it != m_nameLsdb.end()) {
akmhoque2f423352014-06-03 11:49:35 -0500210 _LOG_DEBUG("Deleting Name Lsa");
akmhoque53353462014-04-22 08:43:45 -0500211 (*it).writeLog();
akmhoque31d1d4b2014-05-05 22:08:14 -0500212 if ((*it).getOrigRouter() !=
akmhoque157b0a42014-05-13 00:26:37 -0500213 m_nlsr.getConfParameter().getRouterPrefix()) {
akmhoque31d1d4b2014-05-05 22:08:14 -0500214 m_nlsr.getNamePrefixTable().removeEntry((*it).getOrigRouter(),
215 (*it).getOrigRouter());
216 for (std::list<ndn::Name>::iterator nit = (*it).getNpl().getNameList().begin();
akmhoque157b0a42014-05-13 00:26:37 -0500217 nit != (*it).getNpl().getNameList().end(); ++nit) {
218 if ((*nit) != m_nlsr.getConfParameter().getRouterPrefix()) {
akmhoque31d1d4b2014-05-05 22:08:14 -0500219 m_nlsr.getNamePrefixTable().removeEntry((*nit), (*it).getOrigRouter());
akmhoque53353462014-04-22 08:43:45 -0500220 }
221 }
222 }
223 m_nameLsdb.erase(it);
224 return true;
225 }
226 return false;
227}
228
229bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500230Lsdb::doesNameLsaExist(const ndn::Name& key)
akmhoque53353462014-04-22 08:43:45 -0500231{
232 std::list<NameLsa>::iterator it = std::find_if(m_nameLsdb.begin(),
233 m_nameLsdb.end(),
akmhoque157b0a42014-05-13 00:26:37 -0500234 ndn::bind(nameLsaCompareByKey, _1, key));
235 if (it == m_nameLsdb.end()) {
akmhoque53353462014-04-22 08:43:45 -0500236 return false;
237 }
238 return true;
239}
240
241void
akmhoque2f423352014-06-03 11:49:35 -0500242Lsdb::writeNameLsdbLog()
akmhoque53353462014-04-22 08:43:45 -0500243{
akmhoque2f423352014-06-03 11:49:35 -0500244 _LOG_DEBUG("---------------Name LSDB-------------------");
akmhoque53353462014-04-22 08:43:45 -0500245 for (std::list<NameLsa>::iterator it = m_nameLsdb.begin();
akmhoque157b0a42014-05-13 00:26:37 -0500246 it != m_nameLsdb.end() ; it++) {
akmhoque2f423352014-06-03 11:49:35 -0500247 (*it).writeLog();
akmhoque53353462014-04-22 08:43:45 -0500248 }
249}
250
251// Cor LSA and LSDB related Functions start here
252
akmhoque53353462014-04-22 08:43:45 -0500253static bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500254corLsaCompareByKey(const CoordinateLsa& clsa, const ndn::Name& key)
akmhoque53353462014-04-22 08:43:45 -0500255{
256 return clsa.getKey() == key;
257}
258
259bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500260Lsdb::buildAndInstallOwnCoordinateLsa()
akmhoque53353462014-04-22 08:43:45 -0500261{
akmhoque31d1d4b2014-05-05 22:08:14 -0500262 CoordinateLsa corLsa(m_nlsr.getConfParameter().getRouterPrefix(),
alvy49b1c0c2014-12-19 13:57:46 -0600263 CoordinateLsa::TYPE_STRING,
akmhoque31d1d4b2014-05-05 22:08:14 -0500264 m_nlsr.getSequencingManager().getCorLsaSeq() + 1,
akmhoquec7a79b22014-05-26 08:06:19 -0500265 getLsaExpirationTimePoint(),
akmhoque31d1d4b2014-05-05 22:08:14 -0500266 m_nlsr.getConfParameter().getCorR(),
267 m_nlsr.getConfParameter().getCorTheta());
268 m_nlsr.getSequencingManager().increaseCorLsaSeq();
269 installCoordinateLsa(corLsa);
akmhoque53353462014-04-22 08:43:45 -0500270 return true;
271}
272
akmhoqueb6450b12014-04-24 00:01:03 -0500273CoordinateLsa*
akmhoque31d1d4b2014-05-05 22:08:14 -0500274Lsdb::findCoordinateLsa(const ndn::Name& key)
akmhoque53353462014-04-22 08:43:45 -0500275{
akmhoqueb6450b12014-04-24 00:01:03 -0500276 std::list<CoordinateLsa>::iterator it = std::find_if(m_corLsdb.begin(),
277 m_corLsdb.end(),
akmhoque157b0a42014-05-13 00:26:37 -0500278 ndn::bind(corLsaCompareByKey, _1, key));
279 if (it != m_corLsdb.end()) {
akmhoqueb6450b12014-04-24 00:01:03 -0500280 return &(*it);
akmhoque53353462014-04-22 08:43:45 -0500281 }
akmhoqueb6450b12014-04-24 00:01:03 -0500282 return 0;
akmhoque53353462014-04-22 08:43:45 -0500283}
284
285bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500286Lsdb::isCoordinateLsaNew(const ndn::Name& key, uint64_t seqNo)
akmhoque53353462014-04-22 08:43:45 -0500287{
akmhoqueb6450b12014-04-24 00:01:03 -0500288 CoordinateLsa* clsa = findCoordinateLsa(key);
akmhoque157b0a42014-05-13 00:26:37 -0500289 if (clsa != 0) {
290 if (clsa->getLsSeqNo() < seqNo) {
akmhoque53353462014-04-22 08:43:45 -0500291 return true;
292 }
akmhoque157b0a42014-05-13 00:26:37 -0500293 else {
akmhoque53353462014-04-22 08:43:45 -0500294 return false;
295 }
296 }
297 return true;
298}
299
300ndn::EventId
akmhoque31d1d4b2014-05-05 22:08:14 -0500301Lsdb::scheduleCoordinateLsaExpiration(const ndn::Name& key, int seqNo,
akmhoquec7a79b22014-05-26 08:06:19 -0500302 const ndn::time::seconds& expTime)
akmhoque53353462014-04-22 08:43:45 -0500303{
Vince Lehman7c603292014-09-11 17:48:16 -0500304 return m_scheduler.scheduleEvent(expTime + GRACE_PERIOD,
305 ndn::bind(&Lsdb::exprireOrRefreshCoordinateLsa,
306 this, key, seqNo));
akmhoque53353462014-04-22 08:43:45 -0500307}
308
309bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500310Lsdb::installCoordinateLsa(CoordinateLsa& clsa)
akmhoque53353462014-04-22 08:43:45 -0500311{
Alexander Afanasyev8388ec62014-08-16 18:38:57 -0700312 ndn::time::seconds timeToExpire = m_lsaRefreshTime;
akmhoqueb6450b12014-04-24 00:01:03 -0500313 CoordinateLsa* chkCorLsa = findCoordinateLsa(clsa.getKey());
akmhoque157b0a42014-05-13 00:26:37 -0500314 if (chkCorLsa == 0) {
akmhoque674b0b12014-05-20 14:33:28 -0500315 _LOG_DEBUG("New Coordinate LSA. Adding to LSDB");
akmhoque2f423352014-06-03 11:49:35 -0500316 _LOG_DEBUG("Adding Coordinate Lsa");
akmhoque674b0b12014-05-20 14:33:28 -0500317 clsa.writeLog();
akmhoqueb6450b12014-04-24 00:01:03 -0500318 addCoordinateLsa(clsa);
akmhoque2f423352014-06-03 11:49:35 -0500319
akmhoque157b0a42014-05-13 00:26:37 -0500320 if (clsa.getOrigRouter() != m_nlsr.getConfParameter().getRouterPrefix()) {
akmhoque31d1d4b2014-05-05 22:08:14 -0500321 m_nlsr.getNamePrefixTable().addEntry(clsa.getOrigRouter(),
322 clsa.getOrigRouter());
akmhoque53353462014-04-22 08:43:45 -0500323 }
akmhoque157b0a42014-05-13 00:26:37 -0500324 if (m_nlsr.getConfParameter().getHyperbolicState() >= HYPERBOLIC_STATE_ON) {
akmhoque31d1d4b2014-05-05 22:08:14 -0500325 m_nlsr.getRoutingTable().scheduleRoutingTableCalculation(m_nlsr);
akmhoque53353462014-04-22 08:43:45 -0500326 }
akmhoque157b0a42014-05-13 00:26:37 -0500327 if (clsa.getOrigRouter() != m_nlsr.getConfParameter().getRouterPrefix()) {
akmhoquec7a79b22014-05-26 08:06:19 -0500328 ndn::time::system_clock::Duration duration = clsa.getExpirationTimePoint() -
329 ndn::time::system_clock::now();
330 timeToExpire = ndn::time::duration_cast<ndn::time::seconds>(duration);
akmhoque53353462014-04-22 08:43:45 -0500331 }
akmhoque31d1d4b2014-05-05 22:08:14 -0500332 scheduleCoordinateLsaExpiration(clsa.getKey(),
akmhoqueb6450b12014-04-24 00:01:03 -0500333 clsa.getLsSeqNo(), timeToExpire);
akmhoque53353462014-04-22 08:43:45 -0500334 }
akmhoque157b0a42014-05-13 00:26:37 -0500335 else {
336 if (chkCorLsa->getLsSeqNo() < clsa.getLsSeqNo()) {
akmhoque674b0b12014-05-20 14:33:28 -0500337 _LOG_DEBUG("Updated Coordinate LSA. Updating LSDB");
akmhoque2f423352014-06-03 11:49:35 -0500338 _LOG_DEBUG("Deleting Coordinate Lsa");
akmhoque674b0b12014-05-20 14:33:28 -0500339 chkCorLsa->writeLog();
akmhoqueb6450b12014-04-24 00:01:03 -0500340 chkCorLsa->setLsSeqNo(clsa.getLsSeqNo());
akmhoquec7a79b22014-05-26 08:06:19 -0500341 chkCorLsa->setExpirationTimePoint(clsa.getExpirationTimePoint());
akmhoque157b0a42014-05-13 00:26:37 -0500342 if (!chkCorLsa->isEqualContent(clsa)) {
akmhoqueb6450b12014-04-24 00:01:03 -0500343 chkCorLsa->setCorRadius(clsa.getCorRadius());
344 chkCorLsa->setCorTheta(clsa.getCorTheta());
akmhoque157b0a42014-05-13 00:26:37 -0500345 if (m_nlsr.getConfParameter().getHyperbolicState() >= HYPERBOLIC_STATE_ON) {
akmhoque31d1d4b2014-05-05 22:08:14 -0500346 m_nlsr.getRoutingTable().scheduleRoutingTableCalculation(m_nlsr);
akmhoque53353462014-04-22 08:43:45 -0500347 }
348 }
akmhoque157b0a42014-05-13 00:26:37 -0500349 if (clsa.getOrigRouter() != m_nlsr.getConfParameter().getRouterPrefix()) {
akmhoquec7a79b22014-05-26 08:06:19 -0500350 ndn::time::system_clock::Duration duration = clsa.getExpirationTimePoint() -
351 ndn::time::system_clock::now();
352 timeToExpire = ndn::time::duration_cast<ndn::time::seconds>(duration);
akmhoque53353462014-04-22 08:43:45 -0500353 }
akmhoque31d1d4b2014-05-05 22:08:14 -0500354 cancelScheduleLsaExpiringEvent(chkCorLsa->getExpiringEventId());
355 chkCorLsa->setExpiringEventId(scheduleCoordinateLsaExpiration(clsa.getKey(),
akmhoqueb6450b12014-04-24 00:01:03 -0500356 clsa.getLsSeqNo(),
357 timeToExpire));
akmhoque2f423352014-06-03 11:49:35 -0500358 _LOG_DEBUG("Adding Coordinate Lsa");
akmhoque674b0b12014-05-20 14:33:28 -0500359 chkCorLsa->writeLog();
akmhoque53353462014-04-22 08:43:45 -0500360 }
361 }
362 return true;
363}
364
365bool
akmhoqueb6450b12014-04-24 00:01:03 -0500366Lsdb::addCoordinateLsa(CoordinateLsa& clsa)
akmhoque53353462014-04-22 08:43:45 -0500367{
akmhoqueb6450b12014-04-24 00:01:03 -0500368 std::list<CoordinateLsa>::iterator it = std::find_if(m_corLsdb.begin(),
369 m_corLsdb.end(),
akmhoque157b0a42014-05-13 00:26:37 -0500370 ndn::bind(corLsaCompareByKey, _1,
371 clsa.getKey()));
372 if (it == m_corLsdb.end()) {
akmhoque53353462014-04-22 08:43:45 -0500373 m_corLsdb.push_back(clsa);
374 return true;
375 }
376 return false;
377}
378
379bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500380Lsdb::removeCoordinateLsa(const ndn::Name& key)
akmhoque53353462014-04-22 08:43:45 -0500381{
akmhoqueb6450b12014-04-24 00:01:03 -0500382 std::list<CoordinateLsa>::iterator it = std::find_if(m_corLsdb.begin(),
383 m_corLsdb.end(),
akmhoque157b0a42014-05-13 00:26:37 -0500384 ndn::bind(corLsaCompareByKey,
385 _1, key));
386 if (it != m_corLsdb.end()) {
akmhoque2f423352014-06-03 11:49:35 -0500387 _LOG_DEBUG("Deleting Coordinate Lsa");
akmhoque674b0b12014-05-20 14:33:28 -0500388 (*it).writeLog();
akmhoque31d1d4b2014-05-05 22:08:14 -0500389 if ((*it).getOrigRouter() !=
akmhoque157b0a42014-05-13 00:26:37 -0500390 m_nlsr.getConfParameter().getRouterPrefix()) {
akmhoque31d1d4b2014-05-05 22:08:14 -0500391 m_nlsr.getNamePrefixTable().removeEntry((*it).getOrigRouter(),
392 (*it).getOrigRouter());
akmhoque53353462014-04-22 08:43:45 -0500393 }
394 m_corLsdb.erase(it);
395 return true;
396 }
397 return false;
398}
399
400bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500401Lsdb::doesCoordinateLsaExist(const ndn::Name& key)
akmhoque53353462014-04-22 08:43:45 -0500402{
akmhoqueb6450b12014-04-24 00:01:03 -0500403 std::list<CoordinateLsa>::iterator it = std::find_if(m_corLsdb.begin(),
404 m_corLsdb.end(),
akmhoque157b0a42014-05-13 00:26:37 -0500405 ndn::bind(corLsaCompareByKey,
406 _1, key));
407 if (it == m_corLsdb.end()) {
akmhoque53353462014-04-22 08:43:45 -0500408 return false;
409 }
410 return true;
411}
412
413void
akmhoque2f423352014-06-03 11:49:35 -0500414Lsdb::writeCorLsdbLog()
akmhoque53353462014-04-22 08:43:45 -0500415{
akmhoque2f423352014-06-03 11:49:35 -0500416 _LOG_DEBUG("---------------Cor LSDB-------------------");
akmhoqueb6450b12014-04-24 00:01:03 -0500417 for (std::list<CoordinateLsa>::iterator it = m_corLsdb.begin();
akmhoque157b0a42014-05-13 00:26:37 -0500418 it != m_corLsdb.end() ; it++) {
akmhoque2f423352014-06-03 11:49:35 -0500419 (*it).writeLog();
akmhoque53353462014-04-22 08:43:45 -0500420 }
421}
422
akmhoque53353462014-04-22 08:43:45 -0500423// Adj LSA and LSDB related function starts here
424
425static bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500426adjLsaCompareByKey(AdjLsa& alsa, const ndn::Name& key)
akmhoque53353462014-04-22 08:43:45 -0500427{
428 return alsa.getKey() == key;
429}
430
akmhoque53353462014-04-22 08:43:45 -0500431void
akmhoque31d1d4b2014-05-05 22:08:14 -0500432Lsdb::scheduledAdjLsaBuild()
akmhoque53353462014-04-22 08:43:45 -0500433{
akmhoque674b0b12014-05-20 14:33:28 -0500434 _LOG_DEBUG("scheduledAdjLsaBuild Called");
435 m_nlsr.setIsBuildAdjLsaSheduled(false);
akmhoque157b0a42014-05-13 00:26:37 -0500436 if (m_nlsr.getAdjacencyList().isAdjLsaBuildable(m_nlsr)) {
akmhoque31d1d4b2014-05-05 22:08:14 -0500437 int adjBuildCount = m_nlsr.getAdjBuildCount();
akmhoque157b0a42014-05-13 00:26:37 -0500438 if (adjBuildCount > 0) {
439 if (m_nlsr.getAdjacencyList().getNumOfActiveNeighbor() > 0) {
akmhoque674b0b12014-05-20 14:33:28 -0500440 _LOG_DEBUG("Building and installing Adj LSA");
akmhoque31d1d4b2014-05-05 22:08:14 -0500441 buildAndInstallOwnAdjLsa();
akmhoque53353462014-04-22 08:43:45 -0500442 }
akmhoque157b0a42014-05-13 00:26:37 -0500443 else {
akmhoque31d1d4b2014-05-05 22:08:14 -0500444 ndn::Name key = m_nlsr.getConfParameter().getRouterPrefix();
alvy49b1c0c2014-12-19 13:57:46 -0600445 key.append(AdjLsa::TYPE_STRING);
akmhoque31d1d4b2014-05-05 22:08:14 -0500446 removeAdjLsa(key);
447 m_nlsr.getRoutingTable().scheduleRoutingTableCalculation(m_nlsr);
akmhoque53353462014-04-22 08:43:45 -0500448 }
akmhoque31d1d4b2014-05-05 22:08:14 -0500449 m_nlsr.setAdjBuildCount(m_nlsr.getAdjBuildCount() - adjBuildCount);
akmhoque53353462014-04-22 08:43:45 -0500450 }
451 }
akmhoque157b0a42014-05-13 00:26:37 -0500452 else {
akmhoque674b0b12014-05-20 14:33:28 -0500453 m_nlsr.setIsBuildAdjLsaSheduled(true);
akmhoque31d1d4b2014-05-05 22:08:14 -0500454 int schedulingTime = m_nlsr.getConfParameter().getInterestRetryNumber() *
455 m_nlsr.getConfParameter().getInterestResendTime();
Vince Lehman7c603292014-09-11 17:48:16 -0500456 m_scheduler.scheduleEvent(ndn::time::seconds(schedulingTime),
457 ndn::bind(&Lsdb::scheduledAdjLsaBuild, this));
akmhoque53353462014-04-22 08:43:45 -0500458 }
459}
460
461
462bool
463Lsdb::addAdjLsa(AdjLsa& alsa)
464{
465 std::list<AdjLsa>::iterator it = std::find_if(m_adjLsdb.begin(),
466 m_adjLsdb.end(),
467 bind(adjLsaCompareByKey, _1,
468 alsa.getKey()));
akmhoque157b0a42014-05-13 00:26:37 -0500469 if (it == m_adjLsdb.end()) {
akmhoque53353462014-04-22 08:43:45 -0500470 m_adjLsdb.push_back(alsa);
471 return true;
472 }
473 return false;
474}
475
akmhoqueb6450b12014-04-24 00:01:03 -0500476AdjLsa*
akmhoque31d1d4b2014-05-05 22:08:14 -0500477Lsdb::findAdjLsa(const ndn::Name& key)
akmhoque53353462014-04-22 08:43:45 -0500478{
479 std::list<AdjLsa>::iterator it = std::find_if(m_adjLsdb.begin(),
480 m_adjLsdb.end(),
481 bind(adjLsaCompareByKey, _1, key));
akmhoque157b0a42014-05-13 00:26:37 -0500482 if (it != m_adjLsdb.end()) {
akmhoqueb6450b12014-04-24 00:01:03 -0500483 return &(*it);
akmhoque53353462014-04-22 08:43:45 -0500484 }
akmhoqueb6450b12014-04-24 00:01:03 -0500485 return 0;
akmhoque53353462014-04-22 08:43:45 -0500486}
487
488
489bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500490Lsdb::isAdjLsaNew(const ndn::Name& key, uint64_t seqNo)
akmhoque53353462014-04-22 08:43:45 -0500491{
akmhoqueb6450b12014-04-24 00:01:03 -0500492 AdjLsa* adjLsaCheck = findAdjLsa(key);
akmhoque157b0a42014-05-13 00:26:37 -0500493 if (adjLsaCheck != 0) {
494 if (adjLsaCheck->getLsSeqNo() < seqNo) {
akmhoque53353462014-04-22 08:43:45 -0500495 return true;
496 }
akmhoque157b0a42014-05-13 00:26:37 -0500497 else {
akmhoque53353462014-04-22 08:43:45 -0500498 return false;
499 }
500 }
501 return true;
502}
503
504
505ndn::EventId
akmhoquec7a79b22014-05-26 08:06:19 -0500506Lsdb::scheduleAdjLsaExpiration(const ndn::Name& key, int seqNo,
507 const ndn::time::seconds& expTime)
akmhoque53353462014-04-22 08:43:45 -0500508{
Vince Lehman7c603292014-09-11 17:48:16 -0500509 return m_scheduler.scheduleEvent(expTime + GRACE_PERIOD,
510 ndn::bind(&Lsdb::exprireOrRefreshAdjLsa, this, key, seqNo));
akmhoque53353462014-04-22 08:43:45 -0500511}
512
513bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500514Lsdb::installAdjLsa(AdjLsa& alsa)
akmhoque53353462014-04-22 08:43:45 -0500515{
Alexander Afanasyev8388ec62014-08-16 18:38:57 -0700516 ndn::time::seconds timeToExpire = m_lsaRefreshTime;
akmhoqueb6450b12014-04-24 00:01:03 -0500517 AdjLsa* chkAdjLsa = findAdjLsa(alsa.getKey());
akmhoque157b0a42014-05-13 00:26:37 -0500518 if (chkAdjLsa == 0) {
akmhoque674b0b12014-05-20 14:33:28 -0500519 _LOG_DEBUG("New Adj LSA. Adding to LSDB");
akmhoque2f423352014-06-03 11:49:35 -0500520 _LOG_DEBUG("Adding Adj Lsa");
akmhoque674b0b12014-05-20 14:33:28 -0500521 alsa.writeLog();
akmhoque53353462014-04-22 08:43:45 -0500522 addAdjLsa(alsa);
akmhoque31d1d4b2014-05-05 22:08:14 -0500523 alsa.addNptEntries(m_nlsr);
524 m_nlsr.getRoutingTable().scheduleRoutingTableCalculation(m_nlsr);
akmhoque157b0a42014-05-13 00:26:37 -0500525 if (alsa.getOrigRouter() != m_nlsr.getConfParameter().getRouterPrefix()) {
akmhoquec7a79b22014-05-26 08:06:19 -0500526 ndn::time::system_clock::Duration duration = alsa.getExpirationTimePoint() -
527 ndn::time::system_clock::now();
528 timeToExpire = ndn::time::duration_cast<ndn::time::seconds>(duration);
akmhoque53353462014-04-22 08:43:45 -0500529 }
akmhoque31d1d4b2014-05-05 22:08:14 -0500530 scheduleAdjLsaExpiration(alsa.getKey(),
akmhoque53353462014-04-22 08:43:45 -0500531 alsa.getLsSeqNo(), timeToExpire);
532 }
akmhoque157b0a42014-05-13 00:26:37 -0500533 else {
534 if (chkAdjLsa->getLsSeqNo() < alsa.getLsSeqNo()) {
akmhoque674b0b12014-05-20 14:33:28 -0500535 _LOG_DEBUG("Updated Adj LSA. Updating LSDB");
akmhoque2f423352014-06-03 11:49:35 -0500536 _LOG_DEBUG("Deleting Adj Lsa");
akmhoque674b0b12014-05-20 14:33:28 -0500537 chkAdjLsa->writeLog();
akmhoqueb6450b12014-04-24 00:01:03 -0500538 chkAdjLsa->setLsSeqNo(alsa.getLsSeqNo());
akmhoquec7a79b22014-05-26 08:06:19 -0500539 chkAdjLsa->setExpirationTimePoint(alsa.getExpirationTimePoint());
akmhoque157b0a42014-05-13 00:26:37 -0500540 if (!chkAdjLsa->isEqualContent(alsa)) {
akmhoqueb6450b12014-04-24 00:01:03 -0500541 chkAdjLsa->getAdl().reset();
akmhoquefdbddb12014-05-02 18:35:19 -0500542 chkAdjLsa->getAdl().addAdjacents(alsa.getAdl());
akmhoque31d1d4b2014-05-05 22:08:14 -0500543 m_nlsr.getRoutingTable().scheduleRoutingTableCalculation(m_nlsr);
akmhoque53353462014-04-22 08:43:45 -0500544 }
akmhoque157b0a42014-05-13 00:26:37 -0500545 if (alsa.getOrigRouter() != m_nlsr.getConfParameter().getRouterPrefix()) {
akmhoquec7a79b22014-05-26 08:06:19 -0500546 ndn::time::system_clock::Duration duration = alsa.getExpirationTimePoint() -
547 ndn::time::system_clock::now();
548 timeToExpire = ndn::time::duration_cast<ndn::time::seconds>(duration);
akmhoque53353462014-04-22 08:43:45 -0500549 }
akmhoque31d1d4b2014-05-05 22:08:14 -0500550 cancelScheduleLsaExpiringEvent(chkAdjLsa->getExpiringEventId());
551 chkAdjLsa->setExpiringEventId(scheduleAdjLsaExpiration(alsa.getKey(),
akmhoqueb6450b12014-04-24 00:01:03 -0500552 alsa.getLsSeqNo(),
553 timeToExpire));
akmhoque2f423352014-06-03 11:49:35 -0500554 _LOG_DEBUG("Adding Adj Lsa");
akmhoque674b0b12014-05-20 14:33:28 -0500555 chkAdjLsa->writeLog();
akmhoque53353462014-04-22 08:43:45 -0500556 }
557 }
558 return true;
559}
560
561bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500562Lsdb::buildAndInstallOwnAdjLsa()
akmhoque53353462014-04-22 08:43:45 -0500563{
akmhoque31d1d4b2014-05-05 22:08:14 -0500564 AdjLsa adjLsa(m_nlsr.getConfParameter().getRouterPrefix(),
alvy49b1c0c2014-12-19 13:57:46 -0600565 AdjLsa::TYPE_STRING,
akmhoque31d1d4b2014-05-05 22:08:14 -0500566 m_nlsr.getSequencingManager().getAdjLsaSeq() + 1,
akmhoquec7a79b22014-05-26 08:06:19 -0500567 getLsaExpirationTimePoint(),
akmhoque31d1d4b2014-05-05 22:08:14 -0500568 m_nlsr.getAdjacencyList().getNumOfActiveNeighbor(),
569 m_nlsr.getAdjacencyList());
Vince Lehman904c2412014-09-23 19:36:11 -0500570
akmhoque31d1d4b2014-05-05 22:08:14 -0500571 m_nlsr.getSequencingManager().increaseAdjLsaSeq();
Vince Lehman904c2412014-09-23 19:36:11 -0500572
573 bool isInstalled = installAdjLsa(adjLsa);
574
575 // Delay Sync prefix registration until the first Adjacency LSA is built
576 if (isInstalled && !m_hasSyncPrefixBeenRegistered) {
577 m_nlsr.getSyncLogicHandler().createSyncSocket();
578 m_hasSyncPrefixBeenRegistered = true;
579 }
580
Vince Lehman0bcf9a32014-12-10 11:24:45 -0600581 m_sync.publishRoutingUpdate();
Vince Lehman904c2412014-09-23 19:36:11 -0500582
583 return isInstalled;
akmhoque53353462014-04-22 08:43:45 -0500584}
585
586bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500587Lsdb::removeAdjLsa(const ndn::Name& key)
akmhoque53353462014-04-22 08:43:45 -0500588{
589 std::list<AdjLsa>::iterator it = std::find_if(m_adjLsdb.begin(),
590 m_adjLsdb.end(),
akmhoque157b0a42014-05-13 00:26:37 -0500591 ndn::bind(adjLsaCompareByKey, _1, key));
592 if (it != m_adjLsdb.end()) {
akmhoque2f423352014-06-03 11:49:35 -0500593 _LOG_DEBUG("Deleting Adj Lsa");
akmhoque674b0b12014-05-20 14:33:28 -0500594 (*it).writeLog();
akmhoque31d1d4b2014-05-05 22:08:14 -0500595 (*it).removeNptEntries(m_nlsr);
akmhoque53353462014-04-22 08:43:45 -0500596 m_adjLsdb.erase(it);
597 return true;
598 }
599 return false;
600}
601
602bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500603Lsdb::doesAdjLsaExist(const ndn::Name& key)
akmhoque53353462014-04-22 08:43:45 -0500604{
605 std::list<AdjLsa>::iterator it = std::find_if(m_adjLsdb.begin(),
606 m_adjLsdb.end(),
607 bind(adjLsaCompareByKey, _1, key));
akmhoque157b0a42014-05-13 00:26:37 -0500608 if (it == m_adjLsdb.end()) {
akmhoque53353462014-04-22 08:43:45 -0500609 return false;
610 }
611 return true;
612}
613
614std::list<AdjLsa>&
615Lsdb::getAdjLsdb()
616{
617 return m_adjLsdb;
618}
619
620void
Alexander Afanasyev411ee4b2014-08-16 23:17:03 -0700621Lsdb::setLsaRefreshTime(const seconds& lsaRefreshTime)
akmhoque53353462014-04-22 08:43:45 -0500622{
Alexander Afanasyev411ee4b2014-08-16 23:17:03 -0700623 m_lsaRefreshTime = lsaRefreshTime;
akmhoque53353462014-04-22 08:43:45 -0500624}
625
626void
627Lsdb::setThisRouterPrefix(string trp)
628{
629 m_thisRouterPrefix = trp;
630}
631
632void
akmhoque31d1d4b2014-05-05 22:08:14 -0500633Lsdb::exprireOrRefreshNameLsa(const ndn::Name& lsaKey, uint64_t seqNo)
akmhoque53353462014-04-22 08:43:45 -0500634{
akmhoque674b0b12014-05-20 14:33:28 -0500635 _LOG_DEBUG("Lsdb::exprireOrRefreshNameLsa Called");
636 _LOG_DEBUG("LSA Key : " << lsaKey << " Seq No: " << seqNo);
akmhoqueb6450b12014-04-24 00:01:03 -0500637 NameLsa* chkNameLsa = findNameLsa(lsaKey);
akmhoque157b0a42014-05-13 00:26:37 -0500638 if (chkNameLsa != 0) {
akmhoque674b0b12014-05-20 14:33:28 -0500639 _LOG_DEBUG("LSA Exists with seq no: " << chkNameLsa->getLsSeqNo());
akmhoque157b0a42014-05-13 00:26:37 -0500640 if (chkNameLsa->getLsSeqNo() == seqNo) {
641 if (chkNameLsa->getOrigRouter() == m_thisRouterPrefix) {
akmhoque2f423352014-06-03 11:49:35 -0500642 _LOG_DEBUG("Own Name LSA, so refreshing it");
643 _LOG_DEBUG("Deleting Name Lsa");
akmhoqueb6450b12014-04-24 00:01:03 -0500644 chkNameLsa->writeLog();
akmhoqueb6450b12014-04-24 00:01:03 -0500645 chkNameLsa->setLsSeqNo(chkNameLsa->getLsSeqNo() + 1);
akmhoque31d1d4b2014-05-05 22:08:14 -0500646 m_nlsr.getSequencingManager().setNameLsaSeq(chkNameLsa->getLsSeqNo());
akmhoquec7a79b22014-05-26 08:06:19 -0500647 chkNameLsa->setExpirationTimePoint(getLsaExpirationTimePoint());
akmhoque2f423352014-06-03 11:49:35 -0500648 _LOG_DEBUG("Adding Name Lsa");
akmhoqueb6450b12014-04-24 00:01:03 -0500649 chkNameLsa->writeLog();
akmhoquefdbddb12014-05-02 18:35:19 -0500650 // schedule refreshing event again
akmhoque31d1d4b2014-05-05 22:08:14 -0500651 chkNameLsa->setExpiringEventId(scheduleNameLsaExpiration(chkNameLsa->getKey(),
akmhoquefdbddb12014-05-02 18:35:19 -0500652 chkNameLsa->getLsSeqNo(),
Alexander Afanasyev8388ec62014-08-16 18:38:57 -0700653 m_lsaRefreshTime));
Vince Lehman0bcf9a32014-12-10 11:24:45 -0600654 m_sync.publishRoutingUpdate();
akmhoque53353462014-04-22 08:43:45 -0500655 }
akmhoque157b0a42014-05-13 00:26:37 -0500656 else {
akmhoque674b0b12014-05-20 14:33:28 -0500657 _LOG_DEBUG("Other's Name LSA, so removing form LSDB");
akmhoque31d1d4b2014-05-05 22:08:14 -0500658 removeNameLsa(lsaKey);
akmhoque53353462014-04-22 08:43:45 -0500659 }
660 }
661 }
662}
663
664void
akmhoque31d1d4b2014-05-05 22:08:14 -0500665Lsdb::exprireOrRefreshAdjLsa(const ndn::Name& lsaKey, uint64_t seqNo)
akmhoque53353462014-04-22 08:43:45 -0500666{
akmhoque674b0b12014-05-20 14:33:28 -0500667 _LOG_DEBUG("Lsdb::exprireOrRefreshAdjLsa Called");
668 _LOG_DEBUG("LSA Key : " << lsaKey << " Seq No: " << seqNo);
akmhoqueb6450b12014-04-24 00:01:03 -0500669 AdjLsa* chkAdjLsa = findAdjLsa(lsaKey);
akmhoque157b0a42014-05-13 00:26:37 -0500670 if (chkAdjLsa != 0) {
akmhoque2f423352014-06-03 11:49:35 -0500671 _LOG_DEBUG("LSA Exists with seq no: " << chkAdjLsa->getLsSeqNo());
akmhoque157b0a42014-05-13 00:26:37 -0500672 if (chkAdjLsa->getLsSeqNo() == seqNo) {
673 if (chkAdjLsa->getOrigRouter() == m_thisRouterPrefix) {
akmhoque2f423352014-06-03 11:49:35 -0500674 _LOG_DEBUG("Own Adj LSA, so refreshing it");
675 _LOG_DEBUG("Deleting Adj Lsa");
676 chkAdjLsa->writeLog();
akmhoqueb6450b12014-04-24 00:01:03 -0500677 chkAdjLsa->setLsSeqNo(chkAdjLsa->getLsSeqNo() + 1);
akmhoque31d1d4b2014-05-05 22:08:14 -0500678 m_nlsr.getSequencingManager().setAdjLsaSeq(chkAdjLsa->getLsSeqNo());
akmhoquec7a79b22014-05-26 08:06:19 -0500679 chkAdjLsa->setExpirationTimePoint(getLsaExpirationTimePoint());
akmhoque2f423352014-06-03 11:49:35 -0500680 _LOG_DEBUG("Adding Adj Lsa");
681 chkAdjLsa->writeLog();
akmhoquefdbddb12014-05-02 18:35:19 -0500682 // schedule refreshing event again
akmhoque31d1d4b2014-05-05 22:08:14 -0500683 chkAdjLsa->setExpiringEventId(scheduleAdjLsaExpiration(chkAdjLsa->getKey(),
akmhoquefdbddb12014-05-02 18:35:19 -0500684 chkAdjLsa->getLsSeqNo(),
Alexander Afanasyev8388ec62014-08-16 18:38:57 -0700685 m_lsaRefreshTime));
Vince Lehman0bcf9a32014-12-10 11:24:45 -0600686 m_sync.publishRoutingUpdate();
akmhoque53353462014-04-22 08:43:45 -0500687 }
akmhoque157b0a42014-05-13 00:26:37 -0500688 else {
akmhoque674b0b12014-05-20 14:33:28 -0500689 _LOG_DEBUG("Other's Adj LSA, so removing form LSDB");
akmhoque31d1d4b2014-05-05 22:08:14 -0500690 removeAdjLsa(lsaKey);
akmhoque53353462014-04-22 08:43:45 -0500691 }
692 // schedule Routing table calculaiton
akmhoque31d1d4b2014-05-05 22:08:14 -0500693 m_nlsr.getRoutingTable().scheduleRoutingTableCalculation(m_nlsr);
akmhoque53353462014-04-22 08:43:45 -0500694 }
695 }
696}
697
698void
akmhoque31d1d4b2014-05-05 22:08:14 -0500699Lsdb::exprireOrRefreshCoordinateLsa(const ndn::Name& lsaKey,
akmhoqueb6450b12014-04-24 00:01:03 -0500700 uint64_t seqNo)
akmhoque53353462014-04-22 08:43:45 -0500701{
akmhoque674b0b12014-05-20 14:33:28 -0500702 _LOG_DEBUG("Lsdb::exprireOrRefreshCorLsa Called ");
703 _LOG_DEBUG("LSA Key : " << lsaKey << " Seq No: " << seqNo);
akmhoqueb6450b12014-04-24 00:01:03 -0500704 CoordinateLsa* chkCorLsa = findCoordinateLsa(lsaKey);
akmhoque157b0a42014-05-13 00:26:37 -0500705 if (chkCorLsa != 0) {
akmhoque674b0b12014-05-20 14:33:28 -0500706 _LOG_DEBUG("LSA Exists with seq no: " << chkCorLsa->getLsSeqNo());
akmhoque157b0a42014-05-13 00:26:37 -0500707 if (chkCorLsa->getLsSeqNo() == seqNo) {
708 if (chkCorLsa->getOrigRouter() == m_thisRouterPrefix) {
akmhoque2f423352014-06-03 11:49:35 -0500709 _LOG_DEBUG("Own Cor LSA, so refreshing it");
710 _LOG_DEBUG("Deleting Coordinate Lsa");
711 chkCorLsa->writeLog();
akmhoqueb6450b12014-04-24 00:01:03 -0500712 chkCorLsa->setLsSeqNo(chkCorLsa->getLsSeqNo() + 1);
akmhoque31d1d4b2014-05-05 22:08:14 -0500713 m_nlsr.getSequencingManager().setCorLsaSeq(chkCorLsa->getLsSeqNo());
akmhoquec7a79b22014-05-26 08:06:19 -0500714 chkCorLsa->setExpirationTimePoint(getLsaExpirationTimePoint());
akmhoque2f423352014-06-03 11:49:35 -0500715 _LOG_DEBUG("Adding Coordinate Lsa");
716 chkCorLsa->writeLog();
akmhoquefdbddb12014-05-02 18:35:19 -0500717 // schedule refreshing event again
akmhoque31d1d4b2014-05-05 22:08:14 -0500718 chkCorLsa->setExpiringEventId(scheduleCoordinateLsaExpiration(
719 chkCorLsa->getKey(),
720 chkCorLsa->getLsSeqNo(),
Alexander Afanasyev8388ec62014-08-16 18:38:57 -0700721 m_lsaRefreshTime));
Vince Lehman0bcf9a32014-12-10 11:24:45 -0600722 m_sync.publishRoutingUpdate();
akmhoque53353462014-04-22 08:43:45 -0500723 }
akmhoque157b0a42014-05-13 00:26:37 -0500724 else {
akmhoque674b0b12014-05-20 14:33:28 -0500725 _LOG_DEBUG("Other's Cor LSA, so removing form LSDB");
akmhoque31d1d4b2014-05-05 22:08:14 -0500726 removeCoordinateLsa(lsaKey);
akmhoque53353462014-04-22 08:43:45 -0500727 }
akmhoque157b0a42014-05-13 00:26:37 -0500728 if (m_nlsr.getConfParameter().getHyperbolicState() >= HYPERBOLIC_STATE_ON) {
akmhoque31d1d4b2014-05-05 22:08:14 -0500729 m_nlsr.getRoutingTable().scheduleRoutingTableCalculation(m_nlsr);
akmhoque53353462014-04-22 08:43:45 -0500730 }
731 }
732 }
733}
734
735
736void
Alexander Afanasyev411ee4b2014-08-16 23:17:03 -0700737Lsdb::expressInterest(const ndn::Name& interestName, uint32_t timeoutCount,
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500738 steady_clock::TimePoint deadline)
akmhoque31d1d4b2014-05-05 22:08:14 -0500739{
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500740 if (deadline == DEFAULT_LSA_RETRIEVAL_DEADLINE) {
741 deadline = steady_clock::now() + ndn::time::seconds(static_cast<int>(LSA_REFRESH_TIME_MAX));
Alexander Afanasyev411ee4b2014-08-16 23:17:03 -0700742 }
743
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500744 ndn::Name lsaName = interestName.getSubName(0, interestName.size()-1);
745
akmhoque31d1d4b2014-05-05 22:08:14 -0500746 ndn::Interest interest(interestName);
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500747 uint64_t seqNo = interestName[-1].toNumber();
748
749 if (m_highestSeqNo.find(lsaName) == m_highestSeqNo.end()) {
750 m_highestSeqNo[lsaName] = seqNo;
751 }
752 else if (seqNo > m_highestSeqNo[lsaName]) {
753 m_highestSeqNo[lsaName] = seqNo;
754 }
755 else if (seqNo < m_highestSeqNo[lsaName]) {
756 return;
757 }
758
Alexander Afanasyev411ee4b2014-08-16 23:17:03 -0700759 interest.setInterestLifetime(m_nlsr.getConfParameter().getLsaInterestLifetime());
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500760
761 _LOG_DEBUG("Expressing Interest for LSA: " << interestName << " Seq number: " << seqNo);
akmhoque31d1d4b2014-05-05 22:08:14 -0500762 m_nlsr.getNlsrFace().expressInterest(interest,
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700763 ndn::bind(&Lsdb::onContent,
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500764 this, _2, deadline, lsaName, seqNo),
akmhoque31d1d4b2014-05-05 22:08:14 -0500765 ndn::bind(&Lsdb::processInterestTimedOut,
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500766 this, _1, timeoutCount, deadline, lsaName, seqNo));
akmhoque31d1d4b2014-05-05 22:08:14 -0500767}
768
769void
770Lsdb::processInterest(const ndn::Name& name, const ndn::Interest& interest)
771{
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500772 const ndn::Name& interestName(interest.getName());
773 _LOG_DEBUG("Interest received for LSA: " << interestName);
774
akmhoque31d1d4b2014-05-05 22:08:14 -0500775 string chkString("LSA");
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500776 int32_t lsaPosition = util::getNameComponentPosition(interest.getName(), chkString);
777
akmhoque157b0a42014-05-13 00:26:37 -0500778 if (lsaPosition >= 0) {
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500779
780 ndn::Name originRouter = m_nlsr.getConfParameter().getNetwork();
781 originRouter.append(interestName.getSubName(lsaPosition + 1,
782 interest.getName().size() - lsaPosition - 3));
783
784 uint64_t seqNo = interestName[-1].toNumber();
785 _LOG_DEBUG("LSA sequence number from interest: " << seqNo);
786
787 std::string interestedLsType = interestName[-2].toUri();
788
alvy49b1c0c2014-12-19 13:57:46 -0600789 if (interestedLsType == NameLsa::TYPE_STRING) {
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500790 processInterestForNameLsa(interest, originRouter.append(interestedLsType), seqNo);
akmhoque31d1d4b2014-05-05 22:08:14 -0500791 }
alvy49b1c0c2014-12-19 13:57:46 -0600792 else if (interestedLsType == AdjLsa::TYPE_STRING) {
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500793 processInterestForAdjacencyLsa(interest, originRouter.append(interestedLsType), seqNo);
akmhoque31d1d4b2014-05-05 22:08:14 -0500794 }
alvy49b1c0c2014-12-19 13:57:46 -0600795 else if (interestedLsType == CoordinateLsa::TYPE_STRING) {
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500796 processInterestForCoordinateLsa(interest, originRouter.append(interestedLsType), seqNo);
akmhoque31d1d4b2014-05-05 22:08:14 -0500797 }
akmhoque157b0a42014-05-13 00:26:37 -0500798 else {
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500799 _LOG_WARN("Received unrecognized LSA type: " << interestedLsType);
akmhoque31d1d4b2014-05-05 22:08:14 -0500800 }
801 }
802}
803
804void
akmhoque69c9aa92014-07-23 15:15:05 -0500805Lsdb::putLsaData(const ndn::Interest& interest, const std::string& content)
806{
807 ndn::shared_ptr<ndn::Data> data = ndn::make_shared<ndn::Data>();
808 data->setName(ndn::Name(interest.getName()).appendVersion());
Alexander Afanasyev411ee4b2014-08-16 23:17:03 -0700809 data->setFreshnessPeriod(m_lsaRefreshTime);
akmhoque69c9aa92014-07-23 15:15:05 -0500810 data->setContent(reinterpret_cast<const uint8_t*>(content.c_str()), content.size());
811 m_nlsr.getKeyChain().sign(*data, m_nlsr.getDefaultCertName());
akmhoquedfe615f2014-07-27 14:12:21 -0500812 ndn::SignatureSha256WithRsa signature(data->getSignature());
813 ndn::Name signingCertName = signature.getKeyLocator().getName();
akmhoque69c9aa92014-07-23 15:15:05 -0500814 _LOG_DEBUG("Sending data for LSA(name): " << interest.getName());
akmhoquedfe615f2014-07-27 14:12:21 -0500815 _LOG_DEBUG("Data signed with: " << signingCertName);
akmhoque69c9aa92014-07-23 15:15:05 -0500816 m_nlsr.getNlsrFace().put(*data);
817}
818
819void
akmhoque31d1d4b2014-05-05 22:08:14 -0500820Lsdb::processInterestForNameLsa(const ndn::Interest& interest,
821 const ndn::Name& lsaKey,
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500822 uint64_t seqNo)
akmhoque31d1d4b2014-05-05 22:08:14 -0500823{
824 NameLsa* nameLsa = m_nlsr.getLsdb().findNameLsa(lsaKey);
akmhoque157b0a42014-05-13 00:26:37 -0500825 if (nameLsa != 0) {
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500826 if (nameLsa->getLsSeqNo() == seqNo) {
akmhoque31d1d4b2014-05-05 22:08:14 -0500827 std::string content = nameLsa->getData();
akmhoque69c9aa92014-07-23 15:15:05 -0500828 putLsaData(interest,content);
akmhoque31d1d4b2014-05-05 22:08:14 -0500829 }
830 }
831}
832
833void
834Lsdb::processInterestForAdjacencyLsa(const ndn::Interest& interest,
835 const ndn::Name& lsaKey,
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500836 uint64_t seqNo)
akmhoque31d1d4b2014-05-05 22:08:14 -0500837{
838 AdjLsa* adjLsa = m_nlsr.getLsdb().findAdjLsa(lsaKey);
akmhoque157b0a42014-05-13 00:26:37 -0500839 if (adjLsa != 0) {
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500840 if (adjLsa->getLsSeqNo() == seqNo) {
akmhoque31d1d4b2014-05-05 22:08:14 -0500841 std::string content = adjLsa->getData();
akmhoque69c9aa92014-07-23 15:15:05 -0500842 putLsaData(interest,content);
akmhoque31d1d4b2014-05-05 22:08:14 -0500843 }
844 }
845}
846
847void
848Lsdb::processInterestForCoordinateLsa(const ndn::Interest& interest,
849 const ndn::Name& lsaKey,
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500850 uint64_t seqNo)
akmhoque31d1d4b2014-05-05 22:08:14 -0500851{
852 CoordinateLsa* corLsa = m_nlsr.getLsdb().findCoordinateLsa(lsaKey);
akmhoque157b0a42014-05-13 00:26:37 -0500853 if (corLsa != 0) {
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500854 if (corLsa->getLsSeqNo() == seqNo) {
akmhoque31d1d4b2014-05-05 22:08:14 -0500855 std::string content = corLsa->getData();
akmhoque69c9aa92014-07-23 15:15:05 -0500856 putLsaData(interest,content);
akmhoque31d1d4b2014-05-05 22:08:14 -0500857 }
858 }
859}
860
861void
Alexander Afanasyev411ee4b2014-08-16 23:17:03 -0700862Lsdb::onContent(const ndn::Data& data,
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500863 const steady_clock::TimePoint& deadline, ndn::Name lsaName,
864 uint64_t seqNo)
akmhoque31d1d4b2014-05-05 22:08:14 -0500865{
akmhoquedfe615f2014-07-27 14:12:21 -0500866 _LOG_DEBUG("Received data for LSA(name): " << data.getName());
867 if (data.getSignature().hasKeyLocator()) {
868 if (data.getSignature().getKeyLocator().getType() == ndn::KeyLocator::KeyLocator_Name) {
869 _LOG_DEBUG("Data signed with: " << data.getSignature().getKeyLocator().getName());
870 }
871 }
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700872 m_nlsr.getValidator().validate(data,
873 ndn::bind(&Lsdb::onContentValidated, this, _1),
Alexander Afanasyev411ee4b2014-08-16 23:17:03 -0700874 ndn::bind(&Lsdb::onContentValidationFailed, this, _1, _2,
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500875 deadline, lsaName, seqNo));
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700876
877}
878
879void
Alexander Afanasyev411ee4b2014-08-16 23:17:03 -0700880Lsdb::retryContentValidation(const ndn::shared_ptr<const ndn::Data>& data,
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500881 const steady_clock::TimePoint& deadline, ndn::Name lsaName,
882 uint64_t seqNo)
Alexander Afanasyev411ee4b2014-08-16 23:17:03 -0700883{
884 _LOG_DEBUG("Retrying validation of LSA(name): " << data->getName());
885 if (data->getSignature().hasKeyLocator()) {
886 if (data->getSignature().getKeyLocator().getType() == ndn::KeyLocator::KeyLocator_Name) {
887 _LOG_DEBUG("Data signed with: " << data->getSignature().getKeyLocator().getName());
888 }
889 }
890 m_nlsr.getValidator().validate(*data,
891 ndn::bind(&Lsdb::onContentValidated, this, _1),
892 ndn::bind(&Lsdb::onContentValidationFailed, this, _1, _2,
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500893 deadline, lsaName, seqNo));
Alexander Afanasyev411ee4b2014-08-16 23:17:03 -0700894}
895
896void
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700897Lsdb::onContentValidated(const ndn::shared_ptr<const ndn::Data>& data)
898{
899 const ndn::Name& dataName = data->getName();
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500900 _LOG_DEBUG("Data validation successful for LSA: " << dataName);
901
akmhoque31d1d4b2014-05-05 22:08:14 -0500902 string chkString("LSA");
903 int32_t lsaPosition = util::getNameComponentPosition(dataName, chkString);
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500904
akmhoque157b0a42014-05-13 00:26:37 -0500905 if (lsaPosition >= 0) {
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500906
907 ndn::Name originRouter = m_nlsr.getConfParameter().getNetwork();
908 originRouter.append(dataName.getSubName(lsaPosition + 1, dataName.size() - lsaPosition - 4));
909
910 uint64_t seqNo = dataName[-2].toNumber();
911 string dataContent(reinterpret_cast<const char*>(data->getContent().value()));
912
913 std::string interestedLsType = dataName[-3].toUri();
914
alvy49b1c0c2014-12-19 13:57:46 -0600915 if (interestedLsType == NameLsa::TYPE_STRING) {
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500916 processContentNameLsa(originRouter.append(interestedLsType), seqNo, dataContent);
akmhoque31d1d4b2014-05-05 22:08:14 -0500917 }
alvy49b1c0c2014-12-19 13:57:46 -0600918 else if (interestedLsType == AdjLsa::TYPE_STRING) {
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500919 processContentAdjacencyLsa(originRouter.append(interestedLsType), seqNo, dataContent);
akmhoque31d1d4b2014-05-05 22:08:14 -0500920 }
alvy49b1c0c2014-12-19 13:57:46 -0600921 else if (interestedLsType == CoordinateLsa::TYPE_STRING) {
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500922 processContentCoordinateLsa(originRouter.append(interestedLsType), seqNo, dataContent);
akmhoque31d1d4b2014-05-05 22:08:14 -0500923 }
akmhoque157b0a42014-05-13 00:26:37 -0500924 else {
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500925 _LOG_WARN("Received unrecognized LSA Type: " << interestedLsType);
akmhoque31d1d4b2014-05-05 22:08:14 -0500926 }
927 }
928}
929
930void
Alexander Afanasyev411ee4b2014-08-16 23:17:03 -0700931Lsdb::onContentValidationFailed(const ndn::shared_ptr<const ndn::Data>& data,
932 const std::string& msg,
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500933 const steady_clock::TimePoint& deadline, ndn::Name lsaName,
934 uint64_t seqNo)
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700935{
akmhoque2f423352014-06-03 11:49:35 -0500936 _LOG_DEBUG("Validation Error: " << msg);
Alexander Afanasyev411ee4b2014-08-16 23:17:03 -0700937
938 // Delay re-validation by LSA Interest Lifetime. When error callback will have an error
939 // code, re-validation should be done only when some keys from certification chain failed
940 // to be fetched. After that change, delaying will no longer be necessary.
941
942 // Stop retrying if delayed re-validation will be scheduled pass the deadline
943 if (steady_clock::now() + m_nlsr.getConfParameter().getLsaInterestLifetime() < deadline) {
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500944
945 SequenceNumberMap::const_iterator it = m_highestSeqNo.find(lsaName);
946
947 if (it != m_highestSeqNo.end() && it->second == seqNo) {
948 _LOG_DEBUG("Scheduling revalidation attempt");
949 m_scheduler.scheduleEvent(m_nlsr.getConfParameter().getLsaInterestLifetime(),
950 ndn::bind(&Lsdb::retryContentValidation, this, data,
951 deadline, lsaName, seqNo));
952 }
Alexander Afanasyev411ee4b2014-08-16 23:17:03 -0700953 }
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700954}
955
956void
akmhoque31d1d4b2014-05-05 22:08:14 -0500957Lsdb::processContentNameLsa(const ndn::Name& lsaKey,
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500958 uint64_t lsSeqNo, std::string& dataContent)
akmhoque31d1d4b2014-05-05 22:08:14 -0500959{
akmhoque157b0a42014-05-13 00:26:37 -0500960 if (isNameLsaNew(lsaKey, lsSeqNo)) {
akmhoque31d1d4b2014-05-05 22:08:14 -0500961 NameLsa nameLsa;
akmhoque157b0a42014-05-13 00:26:37 -0500962 if (nameLsa.initializeFromContent(dataContent)) {
akmhoque31d1d4b2014-05-05 22:08:14 -0500963 installNameLsa(nameLsa);
964 }
akmhoque157b0a42014-05-13 00:26:37 -0500965 else {
akmhoque2f423352014-06-03 11:49:35 -0500966 _LOG_DEBUG("LSA data decoding error :(");
akmhoque31d1d4b2014-05-05 22:08:14 -0500967 }
968 }
969}
970
971void
972Lsdb::processContentAdjacencyLsa(const ndn::Name& lsaKey,
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500973 uint64_t lsSeqNo, std::string& dataContent)
akmhoque31d1d4b2014-05-05 22:08:14 -0500974{
akmhoque157b0a42014-05-13 00:26:37 -0500975 if (isAdjLsaNew(lsaKey, lsSeqNo)) {
akmhoque31d1d4b2014-05-05 22:08:14 -0500976 AdjLsa adjLsa;
akmhoque157b0a42014-05-13 00:26:37 -0500977 if (adjLsa.initializeFromContent(dataContent)) {
akmhoque31d1d4b2014-05-05 22:08:14 -0500978 installAdjLsa(adjLsa);
979 }
akmhoque157b0a42014-05-13 00:26:37 -0500980 else {
akmhoque2f423352014-06-03 11:49:35 -0500981 _LOG_DEBUG("LSA data decoding error :(");
akmhoque31d1d4b2014-05-05 22:08:14 -0500982 }
983 }
984}
985
986void
987Lsdb::processContentCoordinateLsa(const ndn::Name& lsaKey,
Ashlesh Gawande5bf83172014-09-19 12:38:17 -0500988 uint64_t lsSeqNo, std::string& dataContent)
akmhoque31d1d4b2014-05-05 22:08:14 -0500989{
akmhoque157b0a42014-05-13 00:26:37 -0500990 if (isCoordinateLsaNew(lsaKey, lsSeqNo)) {
akmhoque31d1d4b2014-05-05 22:08:14 -0500991 CoordinateLsa corLsa;
akmhoque157b0a42014-05-13 00:26:37 -0500992 if (corLsa.initializeFromContent(dataContent)) {
akmhoque31d1d4b2014-05-05 22:08:14 -0500993 installCoordinateLsa(corLsa);
994 }
akmhoque157b0a42014-05-13 00:26:37 -0500995 else {
akmhoque2f423352014-06-03 11:49:35 -0500996 _LOG_DEBUG("LSA data decoding error :(");
akmhoque31d1d4b2014-05-05 22:08:14 -0500997 }
998 }
999}
1000
1001void
Alexander Afanasyev411ee4b2014-08-16 23:17:03 -07001002Lsdb::processInterestTimedOut(const ndn::Interest& interest, uint32_t retransmitNo,
Ashlesh Gawande5bf83172014-09-19 12:38:17 -05001003 const ndn::time::steady_clock::TimePoint& deadline, ndn::Name lsaName,
1004 uint64_t seqNo)
akmhoque31d1d4b2014-05-05 22:08:14 -05001005{
Alexander Afanasyev411ee4b2014-08-16 23:17:03 -07001006 const ndn::Name& interestName = interest.getName();
Ashlesh Gawande5bf83172014-09-19 12:38:17 -05001007 _LOG_DEBUG("Interest timed out for LSA: " << interestName);
Alexander Afanasyev411ee4b2014-08-16 23:17:03 -07001008
1009 if (ndn::time::steady_clock::now() < deadline) {
Ashlesh Gawande5bf83172014-09-19 12:38:17 -05001010
1011 SequenceNumberMap::const_iterator it = m_highestSeqNo.find(lsaName);
1012
1013 if (it != m_highestSeqNo.end() && it->second == seqNo) {
1014 expressInterest(interestName, retransmitNo + 1, deadline);
1015 }
akmhoque06986672014-05-27 13:55:53 -05001016 }
akmhoque31d1d4b2014-05-05 22:08:14 -05001017}
1018
akmhoquec7a79b22014-05-26 08:06:19 -05001019ndn::time::system_clock::TimePoint
1020Lsdb::getLsaExpirationTimePoint()
1021{
1022 ndn::time::system_clock::TimePoint expirationTimePoint = ndn::time::system_clock::now();
1023 expirationTimePoint = expirationTimePoint +
1024 ndn::time::seconds(m_nlsr.getConfParameter().getRouterDeadInterval());
1025 return expirationTimePoint;
1026}
akmhoque31d1d4b2014-05-05 22:08:14 -05001027
1028void
akmhoque2f423352014-06-03 11:49:35 -05001029Lsdb::writeAdjLsdbLog()
akmhoque53353462014-04-22 08:43:45 -05001030{
akmhoque2f423352014-06-03 11:49:35 -05001031 _LOG_DEBUG("---------------Adj LSDB-------------------");
akmhoque53353462014-04-22 08:43:45 -05001032 for (std::list<AdjLsa>::iterator it = m_adjLsdb.begin();
akmhoque157b0a42014-05-13 00:26:37 -05001033 it != m_adjLsdb.end() ; it++) {
akmhoque2f423352014-06-03 11:49:35 -05001034 (*it).writeLog();
akmhoque53353462014-04-22 08:43:45 -05001035 }
1036}
1037
1038//-----utility function -----
1039bool
akmhoque31d1d4b2014-05-05 22:08:14 -05001040Lsdb::doesLsaExist(const ndn::Name& key, const std::string& lsType)
akmhoque53353462014-04-22 08:43:45 -05001041{
alvy49b1c0c2014-12-19 13:57:46 -06001042 if (lsType == NameLsa::TYPE_STRING) {
akmhoque53353462014-04-22 08:43:45 -05001043 return doesNameLsaExist(key);
1044 }
alvy49b1c0c2014-12-19 13:57:46 -06001045 else if (lsType == AdjLsa::TYPE_STRING) {
akmhoque53353462014-04-22 08:43:45 -05001046 return doesAdjLsaExist(key);
1047 }
alvy49b1c0c2014-12-19 13:57:46 -06001048 else if (lsType == CoordinateLsa::TYPE_STRING) {
akmhoqueb6450b12014-04-24 00:01:03 -05001049 return doesCoordinateLsaExist(key);
akmhoque53353462014-04-22 08:43:45 -05001050 }
1051 return false;
1052}
1053
Alexander Afanasyev8388ec62014-08-16 18:38:57 -07001054} // namespace nlsr