blob: 0b7e4e7d50e9bfaed143a7db4eeea4083de9bc77 [file] [log] [blame]
akmhoque3d06e792014-05-27 16:23:20 -05001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
3 * Copyright (c) 2014 University of Memphis,
4 * Regents of the University of California
5 *
6 * This file is part of NLSR (Named-data Link State Routing).
7 * See AUTHORS.md for complete list of NLSR authors and contributors.
8 *
9 * NLSR is free software: you can redistribute it and/or modify it under the terms
10 * of the GNU General Public License as published by the Free Software Foundation,
11 * either version 3 of the License, or (at your option) any later version.
12 *
13 * NLSR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
14 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License along with
18 * NLSR, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
19 *
20 * \author A K M Mahmudul Hoque <ahoque1@memphis.edu>
21 *
22 **/
akmhoque53353462014-04-22 08:43:45 -050023#include <string>
24#include <utility>
akmhoque157b0a42014-05-13 00:26:37 -050025
akmhoque53353462014-04-22 08:43:45 -050026#include "lsdb.hpp"
27#include "nlsr.hpp"
akmhoque157b0a42014-05-13 00:26:37 -050028#include "conf-parameter.hpp"
akmhoque31d1d4b2014-05-05 22:08:14 -050029#include "utility/name-helper.hpp"
akmhoque674b0b12014-05-20 14:33:28 -050030#include "logger.hpp"
akmhoque53353462014-04-22 08:43:45 -050031
32namespace nlsr {
33
akmhoque674b0b12014-05-20 14:33:28 -050034INIT_LOGGER("Lsdb");
35
Vince Lehman18841082014-08-19 17:15:24 -050036const ndn::time::seconds Lsdb::GRACE_PERIOD = ndn::time::seconds(10);
37
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(),
57 "name",
58 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(),
263 "coordinate",
264 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();
445 key.append("adjacency");
446 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(),
565 "adjacency",
566 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
akmhoque157b0a42014-05-13 00:26:37 -0500581 ndn::Name lsaPrefix = m_nlsr.getConfParameter().getLsaPrefix();
akmhoque50125a92014-06-30 08:54:17 -0500582 lsaPrefix.append(m_nlsr.getConfParameter().getSiteName());
583 lsaPrefix.append(m_nlsr.getConfParameter().getRouterName());
Vince Lehman904c2412014-09-23 19:36:11 -0500584
585 m_nlsr.getSyncLogicHandler().publishRoutingUpdate(m_nlsr.getSequencingManager(), lsaPrefix);
586
587 return isInstalled;
akmhoque53353462014-04-22 08:43:45 -0500588}
589
590bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500591Lsdb::removeAdjLsa(const ndn::Name& key)
akmhoque53353462014-04-22 08:43:45 -0500592{
593 std::list<AdjLsa>::iterator it = std::find_if(m_adjLsdb.begin(),
594 m_adjLsdb.end(),
akmhoque157b0a42014-05-13 00:26:37 -0500595 ndn::bind(adjLsaCompareByKey, _1, key));
596 if (it != m_adjLsdb.end()) {
akmhoque2f423352014-06-03 11:49:35 -0500597 _LOG_DEBUG("Deleting Adj Lsa");
akmhoque674b0b12014-05-20 14:33:28 -0500598 (*it).writeLog();
akmhoque31d1d4b2014-05-05 22:08:14 -0500599 (*it).removeNptEntries(m_nlsr);
akmhoque53353462014-04-22 08:43:45 -0500600 m_adjLsdb.erase(it);
601 return true;
602 }
603 return false;
604}
605
606bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500607Lsdb::doesAdjLsaExist(const ndn::Name& key)
akmhoque53353462014-04-22 08:43:45 -0500608{
609 std::list<AdjLsa>::iterator it = std::find_if(m_adjLsdb.begin(),
610 m_adjLsdb.end(),
611 bind(adjLsaCompareByKey, _1, key));
akmhoque157b0a42014-05-13 00:26:37 -0500612 if (it == m_adjLsdb.end()) {
akmhoque53353462014-04-22 08:43:45 -0500613 return false;
614 }
615 return true;
616}
617
618std::list<AdjLsa>&
619Lsdb::getAdjLsdb()
620{
621 return m_adjLsdb;
622}
623
624void
Alexander Afanasyev411ee4b2014-08-16 23:17:03 -0700625Lsdb::setLsaRefreshTime(const seconds& lsaRefreshTime)
akmhoque53353462014-04-22 08:43:45 -0500626{
Alexander Afanasyev411ee4b2014-08-16 23:17:03 -0700627 m_lsaRefreshTime = lsaRefreshTime;
akmhoque53353462014-04-22 08:43:45 -0500628}
629
630void
631Lsdb::setThisRouterPrefix(string trp)
632{
633 m_thisRouterPrefix = trp;
634}
635
636void
akmhoque31d1d4b2014-05-05 22:08:14 -0500637Lsdb::exprireOrRefreshNameLsa(const ndn::Name& lsaKey, uint64_t seqNo)
akmhoque53353462014-04-22 08:43:45 -0500638{
akmhoque674b0b12014-05-20 14:33:28 -0500639 _LOG_DEBUG("Lsdb::exprireOrRefreshNameLsa Called");
640 _LOG_DEBUG("LSA Key : " << lsaKey << " Seq No: " << seqNo);
akmhoqueb6450b12014-04-24 00:01:03 -0500641 NameLsa* chkNameLsa = findNameLsa(lsaKey);
akmhoque157b0a42014-05-13 00:26:37 -0500642 if (chkNameLsa != 0) {
akmhoque674b0b12014-05-20 14:33:28 -0500643 _LOG_DEBUG("LSA Exists with seq no: " << chkNameLsa->getLsSeqNo());
akmhoque157b0a42014-05-13 00:26:37 -0500644 if (chkNameLsa->getLsSeqNo() == seqNo) {
645 if (chkNameLsa->getOrigRouter() == m_thisRouterPrefix) {
akmhoque2f423352014-06-03 11:49:35 -0500646 _LOG_DEBUG("Own Name LSA, so refreshing it");
647 _LOG_DEBUG("Deleting Name Lsa");
akmhoqueb6450b12014-04-24 00:01:03 -0500648 chkNameLsa->writeLog();
akmhoqueb6450b12014-04-24 00:01:03 -0500649 chkNameLsa->setLsSeqNo(chkNameLsa->getLsSeqNo() + 1);
akmhoque31d1d4b2014-05-05 22:08:14 -0500650 m_nlsr.getSequencingManager().setNameLsaSeq(chkNameLsa->getLsSeqNo());
akmhoquec7a79b22014-05-26 08:06:19 -0500651 chkNameLsa->setExpirationTimePoint(getLsaExpirationTimePoint());
akmhoque2f423352014-06-03 11:49:35 -0500652 _LOG_DEBUG("Adding Name Lsa");
akmhoqueb6450b12014-04-24 00:01:03 -0500653 chkNameLsa->writeLog();
akmhoquefdbddb12014-05-02 18:35:19 -0500654 // schedule refreshing event again
akmhoque31d1d4b2014-05-05 22:08:14 -0500655 chkNameLsa->setExpiringEventId(scheduleNameLsaExpiration(chkNameLsa->getKey(),
akmhoquefdbddb12014-05-02 18:35:19 -0500656 chkNameLsa->getLsSeqNo(),
Alexander Afanasyev8388ec62014-08-16 18:38:57 -0700657 m_lsaRefreshTime));
akmhoque53353462014-04-22 08:43:45 -0500658 // publish routing update
akmhoque50125a92014-06-30 08:54:17 -0500659 //ndn::Name lsaPrefix = m_nlsr.getConfParameter().getLsaPrefix();
660 //lsaPrefix.append(m_nlsr.getConfParameter().getRouterPrefix());
akmhoque157b0a42014-05-13 00:26:37 -0500661 ndn::Name lsaPrefix = m_nlsr.getConfParameter().getLsaPrefix();
akmhoque50125a92014-06-30 08:54:17 -0500662 lsaPrefix.append(m_nlsr.getConfParameter().getSiteName());
663 lsaPrefix.append(m_nlsr.getConfParameter().getRouterName());
akmhoque31d1d4b2014-05-05 22:08:14 -0500664 m_nlsr.getSyncLogicHandler().publishRoutingUpdate(m_nlsr.getSequencingManager(),
665 lsaPrefix);
akmhoque53353462014-04-22 08:43:45 -0500666 }
akmhoque157b0a42014-05-13 00:26:37 -0500667 else {
akmhoque674b0b12014-05-20 14:33:28 -0500668 _LOG_DEBUG("Other's Name LSA, so removing form LSDB");
akmhoque31d1d4b2014-05-05 22:08:14 -0500669 removeNameLsa(lsaKey);
akmhoque53353462014-04-22 08:43:45 -0500670 }
671 }
672 }
673}
674
675void
akmhoque31d1d4b2014-05-05 22:08:14 -0500676Lsdb::exprireOrRefreshAdjLsa(const ndn::Name& lsaKey, uint64_t seqNo)
akmhoque53353462014-04-22 08:43:45 -0500677{
akmhoque674b0b12014-05-20 14:33:28 -0500678 _LOG_DEBUG("Lsdb::exprireOrRefreshAdjLsa Called");
679 _LOG_DEBUG("LSA Key : " << lsaKey << " Seq No: " << seqNo);
akmhoqueb6450b12014-04-24 00:01:03 -0500680 AdjLsa* chkAdjLsa = findAdjLsa(lsaKey);
akmhoque157b0a42014-05-13 00:26:37 -0500681 if (chkAdjLsa != 0) {
akmhoque2f423352014-06-03 11:49:35 -0500682 _LOG_DEBUG("LSA Exists with seq no: " << chkAdjLsa->getLsSeqNo());
akmhoque157b0a42014-05-13 00:26:37 -0500683 if (chkAdjLsa->getLsSeqNo() == seqNo) {
684 if (chkAdjLsa->getOrigRouter() == m_thisRouterPrefix) {
akmhoque2f423352014-06-03 11:49:35 -0500685 _LOG_DEBUG("Own Adj LSA, so refreshing it");
686 _LOG_DEBUG("Deleting Adj Lsa");
687 chkAdjLsa->writeLog();
akmhoqueb6450b12014-04-24 00:01:03 -0500688 chkAdjLsa->setLsSeqNo(chkAdjLsa->getLsSeqNo() + 1);
akmhoque31d1d4b2014-05-05 22:08:14 -0500689 m_nlsr.getSequencingManager().setAdjLsaSeq(chkAdjLsa->getLsSeqNo());
akmhoquec7a79b22014-05-26 08:06:19 -0500690 chkAdjLsa->setExpirationTimePoint(getLsaExpirationTimePoint());
akmhoque2f423352014-06-03 11:49:35 -0500691 _LOG_DEBUG("Adding Adj Lsa");
692 chkAdjLsa->writeLog();
akmhoquefdbddb12014-05-02 18:35:19 -0500693 // schedule refreshing event again
akmhoque31d1d4b2014-05-05 22:08:14 -0500694 chkAdjLsa->setExpiringEventId(scheduleAdjLsaExpiration(chkAdjLsa->getKey(),
akmhoquefdbddb12014-05-02 18:35:19 -0500695 chkAdjLsa->getLsSeqNo(),
Alexander Afanasyev8388ec62014-08-16 18:38:57 -0700696 m_lsaRefreshTime));
akmhoque53353462014-04-22 08:43:45 -0500697 // publish routing update
akmhoque50125a92014-06-30 08:54:17 -0500698 //ndn::Name lsaPrefix = m_nlsr.getConfParameter().getLsaPrefix();
699 //lsaPrefix.append(m_nlsr.getConfParameter().getRouterPrefix());
akmhoque157b0a42014-05-13 00:26:37 -0500700 ndn::Name lsaPrefix = m_nlsr.getConfParameter().getLsaPrefix();
akmhoque50125a92014-06-30 08:54:17 -0500701 lsaPrefix.append(m_nlsr.getConfParameter().getSiteName());
702 lsaPrefix.append(m_nlsr.getConfParameter().getRouterName());
akmhoque31d1d4b2014-05-05 22:08:14 -0500703 m_nlsr.getSyncLogicHandler().publishRoutingUpdate(m_nlsr.getSequencingManager(),
704 lsaPrefix);
akmhoque53353462014-04-22 08:43:45 -0500705 }
akmhoque157b0a42014-05-13 00:26:37 -0500706 else {
akmhoque674b0b12014-05-20 14:33:28 -0500707 _LOG_DEBUG("Other's Adj LSA, so removing form LSDB");
akmhoque31d1d4b2014-05-05 22:08:14 -0500708 removeAdjLsa(lsaKey);
akmhoque53353462014-04-22 08:43:45 -0500709 }
710 // schedule Routing table calculaiton
akmhoque31d1d4b2014-05-05 22:08:14 -0500711 m_nlsr.getRoutingTable().scheduleRoutingTableCalculation(m_nlsr);
akmhoque53353462014-04-22 08:43:45 -0500712 }
713 }
714}
715
716void
akmhoque31d1d4b2014-05-05 22:08:14 -0500717Lsdb::exprireOrRefreshCoordinateLsa(const ndn::Name& lsaKey,
akmhoqueb6450b12014-04-24 00:01:03 -0500718 uint64_t seqNo)
akmhoque53353462014-04-22 08:43:45 -0500719{
akmhoque674b0b12014-05-20 14:33:28 -0500720 _LOG_DEBUG("Lsdb::exprireOrRefreshCorLsa Called ");
721 _LOG_DEBUG("LSA Key : " << lsaKey << " Seq No: " << seqNo);
akmhoqueb6450b12014-04-24 00:01:03 -0500722 CoordinateLsa* chkCorLsa = findCoordinateLsa(lsaKey);
akmhoque157b0a42014-05-13 00:26:37 -0500723 if (chkCorLsa != 0) {
akmhoque674b0b12014-05-20 14:33:28 -0500724 _LOG_DEBUG("LSA Exists with seq no: " << chkCorLsa->getLsSeqNo());
akmhoque157b0a42014-05-13 00:26:37 -0500725 if (chkCorLsa->getLsSeqNo() == seqNo) {
726 if (chkCorLsa->getOrigRouter() == m_thisRouterPrefix) {
akmhoque2f423352014-06-03 11:49:35 -0500727 _LOG_DEBUG("Own Cor LSA, so refreshing it");
728 _LOG_DEBUG("Deleting Coordinate Lsa");
729 chkCorLsa->writeLog();
akmhoqueb6450b12014-04-24 00:01:03 -0500730 chkCorLsa->setLsSeqNo(chkCorLsa->getLsSeqNo() + 1);
akmhoque31d1d4b2014-05-05 22:08:14 -0500731 m_nlsr.getSequencingManager().setCorLsaSeq(chkCorLsa->getLsSeqNo());
akmhoquec7a79b22014-05-26 08:06:19 -0500732 chkCorLsa->setExpirationTimePoint(getLsaExpirationTimePoint());
akmhoque2f423352014-06-03 11:49:35 -0500733 _LOG_DEBUG("Adding Coordinate Lsa");
734 chkCorLsa->writeLog();
akmhoquefdbddb12014-05-02 18:35:19 -0500735 // schedule refreshing event again
akmhoque31d1d4b2014-05-05 22:08:14 -0500736 chkCorLsa->setExpiringEventId(scheduleCoordinateLsaExpiration(
737 chkCorLsa->getKey(),
738 chkCorLsa->getLsSeqNo(),
Alexander Afanasyev8388ec62014-08-16 18:38:57 -0700739 m_lsaRefreshTime));
akmhoque53353462014-04-22 08:43:45 -0500740 // publish routing update
akmhoque50125a92014-06-30 08:54:17 -0500741 //ndn::Name lsaPrefix = m_nlsr.getConfParameter().getLsaPrefix();
742 //lsaPrefix.append(m_nlsr.getConfParameter().getRouterPrefix());
akmhoque157b0a42014-05-13 00:26:37 -0500743 ndn::Name lsaPrefix = m_nlsr.getConfParameter().getLsaPrefix();
akmhoque50125a92014-06-30 08:54:17 -0500744 lsaPrefix.append(m_nlsr.getConfParameter().getSiteName());
745 lsaPrefix.append(m_nlsr.getConfParameter().getRouterName());
akmhoque31d1d4b2014-05-05 22:08:14 -0500746 m_nlsr.getSyncLogicHandler().publishRoutingUpdate(m_nlsr.getSequencingManager(),
747 lsaPrefix);
akmhoque53353462014-04-22 08:43:45 -0500748 }
akmhoque157b0a42014-05-13 00:26:37 -0500749 else {
akmhoque674b0b12014-05-20 14:33:28 -0500750 _LOG_DEBUG("Other's Cor LSA, so removing form LSDB");
akmhoque31d1d4b2014-05-05 22:08:14 -0500751 removeCoordinateLsa(lsaKey);
akmhoque53353462014-04-22 08:43:45 -0500752 }
akmhoque157b0a42014-05-13 00:26:37 -0500753 if (m_nlsr.getConfParameter().getHyperbolicState() >= HYPERBOLIC_STATE_ON) {
akmhoque31d1d4b2014-05-05 22:08:14 -0500754 m_nlsr.getRoutingTable().scheduleRoutingTableCalculation(m_nlsr);
akmhoque53353462014-04-22 08:43:45 -0500755 }
756 }
757 }
758}
759
760
761void
Alexander Afanasyev411ee4b2014-08-16 23:17:03 -0700762Lsdb::expressInterest(const ndn::Name& interestName, uint32_t timeoutCount,
763 steady_clock::TimePoint deadline/* = steady_clock::TimePoint::min()*/)
akmhoque31d1d4b2014-05-05 22:08:14 -0500764{
Alexander Afanasyev411ee4b2014-08-16 23:17:03 -0700765 if (deadline == steady_clock::TimePoint::min()) {
766 deadline = steady_clock::now() + m_lsaRefreshTime;
767 }
768
akmhoque31d1d4b2014-05-05 22:08:14 -0500769 ndn::Interest interest(interestName);
akmhoquedfe615f2014-07-27 14:12:21 -0500770 uint64_t interestedLsSeqNo = interestName[-1].toNumber();
Alexander Afanasyev411ee4b2014-08-16 23:17:03 -0700771 _LOG_DEBUG("Expressing Interest for LSA(name): " << interestName
772 << " Seq number: " << interestedLsSeqNo);
773 interest.setInterestLifetime(m_nlsr.getConfParameter().getLsaInterestLifetime());
akmhoque31d1d4b2014-05-05 22:08:14 -0500774 m_nlsr.getNlsrFace().expressInterest(interest,
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700775 ndn::bind(&Lsdb::onContent,
Alexander Afanasyev411ee4b2014-08-16 23:17:03 -0700776 this, _2, deadline),
akmhoque31d1d4b2014-05-05 22:08:14 -0500777 ndn::bind(&Lsdb::processInterestTimedOut,
Alexander Afanasyev411ee4b2014-08-16 23:17:03 -0700778 this, _1, timeoutCount, deadline));
akmhoque31d1d4b2014-05-05 22:08:14 -0500779}
780
781void
782Lsdb::processInterest(const ndn::Name& name, const ndn::Interest& interest)
783{
784 const ndn::Name& intName(interest.getName());
akmhoque674b0b12014-05-20 14:33:28 -0500785 _LOG_DEBUG("Interest recevied for LSA(name): " << intName);
akmhoque31d1d4b2014-05-05 22:08:14 -0500786 string chkString("LSA");
787 int32_t lsaPosition = util::getNameComponentPosition(interest.getName(),
788 chkString);
akmhoque157b0a42014-05-13 00:26:37 -0500789 if (lsaPosition >= 0) {
akmhoque31d1d4b2014-05-05 22:08:14 -0500790 std::string interestedLsType;
791 uint64_t interestedLsSeqNo;
akmhoque50125a92014-06-30 08:54:17 -0500792 ndn::Name origRouter = m_nlsr.getConfParameter().getNetwork();
793 origRouter.append(intName.getSubName(lsaPosition + 1,
794 interest.getName().size() - lsaPosition - 3));
akmhoque157b0a42014-05-13 00:26:37 -0500795 interestedLsType = intName[-2].toUri();
akmhoque31d1d4b2014-05-05 22:08:14 -0500796 interestedLsSeqNo = intName[-1].toNumber();
akmhoquedfe615f2014-07-27 14:12:21 -0500797 _LOG_DEBUG("LSA sequence number from interest: " << interestedLsSeqNo);
akmhoque157b0a42014-05-13 00:26:37 -0500798 if (interestedLsType == "name") {
akmhoque31d1d4b2014-05-05 22:08:14 -0500799 processInterestForNameLsa(interest,
800 origRouter.append(interestedLsType),
801 interestedLsSeqNo);
802 return;
803 }
akmhoque157b0a42014-05-13 00:26:37 -0500804 else if (interestedLsType == "adjacency") {
akmhoque31d1d4b2014-05-05 22:08:14 -0500805 processInterestForAdjacencyLsa(interest,
806 origRouter.append(interestedLsType),
807 interestedLsSeqNo);
808 return;
809 }
akmhoque157b0a42014-05-13 00:26:37 -0500810 else if (interestedLsType == "coordinate") {
akmhoque31d1d4b2014-05-05 22:08:14 -0500811 processInterestForCoordinateLsa(interest,
812 origRouter.append(interestedLsType),
813 interestedLsSeqNo);
814 return;
815 }
akmhoque157b0a42014-05-13 00:26:37 -0500816 else {
akmhoque2f423352014-06-03 11:49:35 -0500817 _LOG_DEBUG("Unrecognized LSA Type :(");
akmhoque31d1d4b2014-05-05 22:08:14 -0500818 }
819 }
820}
821
822void
akmhoque69c9aa92014-07-23 15:15:05 -0500823Lsdb::putLsaData(const ndn::Interest& interest, const std::string& content)
824{
825 ndn::shared_ptr<ndn::Data> data = ndn::make_shared<ndn::Data>();
826 data->setName(ndn::Name(interest.getName()).appendVersion());
Alexander Afanasyev411ee4b2014-08-16 23:17:03 -0700827 data->setFreshnessPeriod(m_lsaRefreshTime);
akmhoque69c9aa92014-07-23 15:15:05 -0500828 data->setContent(reinterpret_cast<const uint8_t*>(content.c_str()), content.size());
829 m_nlsr.getKeyChain().sign(*data, m_nlsr.getDefaultCertName());
akmhoquedfe615f2014-07-27 14:12:21 -0500830 ndn::SignatureSha256WithRsa signature(data->getSignature());
831 ndn::Name signingCertName = signature.getKeyLocator().getName();
akmhoque69c9aa92014-07-23 15:15:05 -0500832 _LOG_DEBUG("Sending data for LSA(name): " << interest.getName());
akmhoquedfe615f2014-07-27 14:12:21 -0500833 _LOG_DEBUG("Data signed with: " << signingCertName);
akmhoque69c9aa92014-07-23 15:15:05 -0500834 m_nlsr.getNlsrFace().put(*data);
835}
836
837void
akmhoque31d1d4b2014-05-05 22:08:14 -0500838Lsdb::processInterestForNameLsa(const ndn::Interest& interest,
839 const ndn::Name& lsaKey,
840 uint32_t interestedlsSeqNo)
841{
842 NameLsa* nameLsa = m_nlsr.getLsdb().findNameLsa(lsaKey);
akmhoque157b0a42014-05-13 00:26:37 -0500843 if (nameLsa != 0) {
844 if (nameLsa->getLsSeqNo() >= interestedlsSeqNo) {
akmhoque31d1d4b2014-05-05 22:08:14 -0500845 std::string content = nameLsa->getData();
akmhoque69c9aa92014-07-23 15:15:05 -0500846 putLsaData(interest,content);
akmhoque31d1d4b2014-05-05 22:08:14 -0500847 }
848 }
849}
850
851void
852Lsdb::processInterestForAdjacencyLsa(const ndn::Interest& interest,
853 const ndn::Name& lsaKey,
854 uint32_t interestedlsSeqNo)
855{
856 AdjLsa* adjLsa = m_nlsr.getLsdb().findAdjLsa(lsaKey);
akmhoque157b0a42014-05-13 00:26:37 -0500857 if (adjLsa != 0) {
858 if (adjLsa->getLsSeqNo() >= interestedlsSeqNo) {
akmhoque31d1d4b2014-05-05 22:08:14 -0500859 std::string content = adjLsa->getData();
akmhoque69c9aa92014-07-23 15:15:05 -0500860 putLsaData(interest,content);
akmhoque31d1d4b2014-05-05 22:08:14 -0500861 }
862 }
863}
864
865void
866Lsdb::processInterestForCoordinateLsa(const ndn::Interest& interest,
867 const ndn::Name& lsaKey,
868 uint32_t interestedlsSeqNo)
869{
870 CoordinateLsa* corLsa = m_nlsr.getLsdb().findCoordinateLsa(lsaKey);
akmhoque157b0a42014-05-13 00:26:37 -0500871 if (corLsa != 0) {
872 if (corLsa->getLsSeqNo() >= interestedlsSeqNo) {
akmhoque31d1d4b2014-05-05 22:08:14 -0500873 std::string content = corLsa->getData();
akmhoque69c9aa92014-07-23 15:15:05 -0500874 putLsaData(interest,content);
akmhoque31d1d4b2014-05-05 22:08:14 -0500875 }
876 }
877}
878
879void
Alexander Afanasyev411ee4b2014-08-16 23:17:03 -0700880Lsdb::onContent(const ndn::Data& data,
881 const steady_clock::TimePoint& deadline)
akmhoque31d1d4b2014-05-05 22:08:14 -0500882{
akmhoquedfe615f2014-07-27 14:12:21 -0500883 _LOG_DEBUG("Received data for LSA(name): " << data.getName());
884 if (data.getSignature().hasKeyLocator()) {
885 if (data.getSignature().getKeyLocator().getType() == ndn::KeyLocator::KeyLocator_Name) {
886 _LOG_DEBUG("Data signed with: " << data.getSignature().getKeyLocator().getName());
887 }
888 }
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700889 m_nlsr.getValidator().validate(data,
890 ndn::bind(&Lsdb::onContentValidated, this, _1),
Alexander Afanasyev411ee4b2014-08-16 23:17:03 -0700891 ndn::bind(&Lsdb::onContentValidationFailed, this, _1, _2,
892 deadline));
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700893
894}
895
896void
Alexander Afanasyev411ee4b2014-08-16 23:17:03 -0700897Lsdb::retryContentValidation(const ndn::shared_ptr<const ndn::Data>& data,
898 const steady_clock::TimePoint& deadline)
899{
900 _LOG_DEBUG("Retrying validation of LSA(name): " << data->getName());
901 if (data->getSignature().hasKeyLocator()) {
902 if (data->getSignature().getKeyLocator().getType() == ndn::KeyLocator::KeyLocator_Name) {
903 _LOG_DEBUG("Data signed with: " << data->getSignature().getKeyLocator().getName());
904 }
905 }
906 m_nlsr.getValidator().validate(*data,
907 ndn::bind(&Lsdb::onContentValidated, this, _1),
908 ndn::bind(&Lsdb::onContentValidationFailed, this, _1, _2,
909 deadline));
910}
911
912void
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700913Lsdb::onContentValidated(const ndn::shared_ptr<const ndn::Data>& data)
914{
915 const ndn::Name& dataName = data->getName();
akmhoquedfe615f2014-07-27 14:12:21 -0500916 _LOG_DEBUG("Data validation successful for LSA(name): " << dataName);
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700917 string dataContent(reinterpret_cast<const char*>(data->getContent().value()));
akmhoque31d1d4b2014-05-05 22:08:14 -0500918 string chkString("LSA");
919 int32_t lsaPosition = util::getNameComponentPosition(dataName, chkString);
akmhoque157b0a42014-05-13 00:26:37 -0500920 if (lsaPosition >= 0) {
akmhoque31d1d4b2014-05-05 22:08:14 -0500921 std::string interestedLsType;
922 uint64_t interestedLsSeqNo;
akmhoque50125a92014-06-30 08:54:17 -0500923 ndn::Name origRouter = m_nlsr.getConfParameter().getNetwork();
924 origRouter.append(dataName.getSubName(lsaPosition + 1,
925 dataName.size() - lsaPosition - 4));
akmhoque157b0a42014-05-13 00:26:37 -0500926 interestedLsType = dataName[-3].toUri();
akmhoque31d1d4b2014-05-05 22:08:14 -0500927 interestedLsSeqNo = dataName[-2].toNumber();
akmhoque157b0a42014-05-13 00:26:37 -0500928 if (interestedLsType == "name") {
akmhoque31d1d4b2014-05-05 22:08:14 -0500929 processContentNameLsa(origRouter.append(interestedLsType),
930 interestedLsSeqNo, dataContent);
931 return;
932 }
akmhoque157b0a42014-05-13 00:26:37 -0500933 else if (interestedLsType == "adjacency") {
akmhoque31d1d4b2014-05-05 22:08:14 -0500934 processContentAdjacencyLsa(origRouter.append(interestedLsType),
935 interestedLsSeqNo, dataContent);
936 return;
937 }
akmhoque157b0a42014-05-13 00:26:37 -0500938 else if (interestedLsType == "coordinate") {
akmhoque31d1d4b2014-05-05 22:08:14 -0500939 processContentCoordinateLsa(origRouter.append(interestedLsType),
940 interestedLsSeqNo, dataContent);
941 return;
942 }
akmhoque157b0a42014-05-13 00:26:37 -0500943 else {
akmhoque2f423352014-06-03 11:49:35 -0500944 _LOG_DEBUG("Unrecognized LSA Type :(");
akmhoque31d1d4b2014-05-05 22:08:14 -0500945 }
946 }
947}
948
949void
Alexander Afanasyev411ee4b2014-08-16 23:17:03 -0700950Lsdb::onContentValidationFailed(const ndn::shared_ptr<const ndn::Data>& data,
951 const std::string& msg,
952 const steady_clock::TimePoint& deadline)
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700953{
akmhoque2f423352014-06-03 11:49:35 -0500954 _LOG_DEBUG("Validation Error: " << msg);
Alexander Afanasyev411ee4b2014-08-16 23:17:03 -0700955
956 // Delay re-validation by LSA Interest Lifetime. When error callback will have an error
957 // code, re-validation should be done only when some keys from certification chain failed
958 // to be fetched. After that change, delaying will no longer be necessary.
959
960 // Stop retrying if delayed re-validation will be scheduled pass the deadline
961 if (steady_clock::now() + m_nlsr.getConfParameter().getLsaInterestLifetime() < deadline) {
962 _LOG_DEBUG("Scheduling revalidation");
Vince Lehman7c603292014-09-11 17:48:16 -0500963 m_scheduler.scheduleEvent(m_nlsr.getConfParameter().getLsaInterestLifetime(),
964 ndn::bind(&Lsdb::retryContentValidation, this, data, deadline));
Alexander Afanasyev411ee4b2014-08-16 23:17:03 -0700965 }
Yingdi Yu20e3a6e2014-05-26 23:16:10 -0700966}
967
968void
akmhoque31d1d4b2014-05-05 22:08:14 -0500969Lsdb::processContentNameLsa(const ndn::Name& lsaKey,
970 uint32_t lsSeqNo, std::string& dataContent)
971{
akmhoque157b0a42014-05-13 00:26:37 -0500972 if (isNameLsaNew(lsaKey, lsSeqNo)) {
akmhoque31d1d4b2014-05-05 22:08:14 -0500973 NameLsa nameLsa;
akmhoque157b0a42014-05-13 00:26:37 -0500974 if (nameLsa.initializeFromContent(dataContent)) {
akmhoque31d1d4b2014-05-05 22:08:14 -0500975 installNameLsa(nameLsa);
976 }
akmhoque157b0a42014-05-13 00:26:37 -0500977 else {
akmhoque2f423352014-06-03 11:49:35 -0500978 _LOG_DEBUG("LSA data decoding error :(");
akmhoque31d1d4b2014-05-05 22:08:14 -0500979 }
980 }
981}
982
983void
984Lsdb::processContentAdjacencyLsa(const ndn::Name& lsaKey,
985 uint32_t lsSeqNo, std::string& dataContent)
986{
akmhoque157b0a42014-05-13 00:26:37 -0500987 if (isAdjLsaNew(lsaKey, lsSeqNo)) {
akmhoque31d1d4b2014-05-05 22:08:14 -0500988 AdjLsa adjLsa;
akmhoque157b0a42014-05-13 00:26:37 -0500989 if (adjLsa.initializeFromContent(dataContent)) {
akmhoque31d1d4b2014-05-05 22:08:14 -0500990 installAdjLsa(adjLsa);
991 }
akmhoque157b0a42014-05-13 00:26:37 -0500992 else {
akmhoque2f423352014-06-03 11:49:35 -0500993 _LOG_DEBUG("LSA data decoding error :(");
akmhoque31d1d4b2014-05-05 22:08:14 -0500994 }
995 }
996}
997
998void
999Lsdb::processContentCoordinateLsa(const ndn::Name& lsaKey,
1000 uint32_t lsSeqNo, std::string& dataContent)
1001{
akmhoque157b0a42014-05-13 00:26:37 -05001002 if (isCoordinateLsaNew(lsaKey, lsSeqNo)) {
akmhoque31d1d4b2014-05-05 22:08:14 -05001003 CoordinateLsa corLsa;
akmhoque157b0a42014-05-13 00:26:37 -05001004 if (corLsa.initializeFromContent(dataContent)) {
akmhoque31d1d4b2014-05-05 22:08:14 -05001005 installCoordinateLsa(corLsa);
1006 }
akmhoque157b0a42014-05-13 00:26:37 -05001007 else {
akmhoque2f423352014-06-03 11:49:35 -05001008 _LOG_DEBUG("LSA data decoding error :(");
akmhoque31d1d4b2014-05-05 22:08:14 -05001009 }
1010 }
1011}
1012
1013void
Alexander Afanasyev411ee4b2014-08-16 23:17:03 -07001014Lsdb::processInterestTimedOut(const ndn::Interest& interest, uint32_t retransmitNo,
1015 const ndn::time::steady_clock::TimePoint& deadline)
akmhoque31d1d4b2014-05-05 22:08:14 -05001016{
Alexander Afanasyev411ee4b2014-08-16 23:17:03 -07001017 const ndn::Name& interestName = interest.getName();
akmhoque674b0b12014-05-20 14:33:28 -05001018 _LOG_DEBUG("Interest timed out for LSA(name): " << interestName);
Alexander Afanasyev411ee4b2014-08-16 23:17:03 -07001019
1020 if (ndn::time::steady_clock::now() < deadline) {
1021 expressInterest(interestName, retransmitNo + 1, deadline);
akmhoque06986672014-05-27 13:55:53 -05001022 }
akmhoque31d1d4b2014-05-05 22:08:14 -05001023}
1024
akmhoquec7a79b22014-05-26 08:06:19 -05001025ndn::time::system_clock::TimePoint
1026Lsdb::getLsaExpirationTimePoint()
1027{
1028 ndn::time::system_clock::TimePoint expirationTimePoint = ndn::time::system_clock::now();
1029 expirationTimePoint = expirationTimePoint +
1030 ndn::time::seconds(m_nlsr.getConfParameter().getRouterDeadInterval());
1031 return expirationTimePoint;
1032}
akmhoque31d1d4b2014-05-05 22:08:14 -05001033
1034void
akmhoque2f423352014-06-03 11:49:35 -05001035Lsdb::writeAdjLsdbLog()
akmhoque53353462014-04-22 08:43:45 -05001036{
akmhoque2f423352014-06-03 11:49:35 -05001037 _LOG_DEBUG("---------------Adj LSDB-------------------");
akmhoque53353462014-04-22 08:43:45 -05001038 for (std::list<AdjLsa>::iterator it = m_adjLsdb.begin();
akmhoque157b0a42014-05-13 00:26:37 -05001039 it != m_adjLsdb.end() ; it++) {
akmhoque2f423352014-06-03 11:49:35 -05001040 (*it).writeLog();
akmhoque53353462014-04-22 08:43:45 -05001041 }
1042}
1043
1044//-----utility function -----
1045bool
akmhoque31d1d4b2014-05-05 22:08:14 -05001046Lsdb::doesLsaExist(const ndn::Name& key, const std::string& lsType)
akmhoque53353462014-04-22 08:43:45 -05001047{
akmhoque157b0a42014-05-13 00:26:37 -05001048 if (lsType == "name") {
akmhoque53353462014-04-22 08:43:45 -05001049 return doesNameLsaExist(key);
1050 }
akmhoque157b0a42014-05-13 00:26:37 -05001051 else if (lsType == "adjacency") {
akmhoque53353462014-04-22 08:43:45 -05001052 return doesAdjLsaExist(key);
1053 }
akmhoque157b0a42014-05-13 00:26:37 -05001054 else if (lsType == "coordinate") {
akmhoqueb6450b12014-04-24 00:01:03 -05001055 return doesCoordinateLsaExist(key);
akmhoque53353462014-04-22 08:43:45 -05001056 }
1057 return false;
1058}
1059
Alexander Afanasyev8388ec62014-08-16 18:38:57 -07001060} // namespace nlsr