blob: 5c98ed8d92ea776bf66faedf0b836effe617b37d [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 <algorithm>
akmhoque31d1d4b2014-05-05 22:08:14 -050024#include <ndn-cxx/common.hpp>
akmhoquec8a10f72014-04-25 18:42:55 -050025#include "adjacency-list.hpp"
akmhoque53353462014-04-22 08:43:45 -050026#include "adjacent.hpp"
27#include "nlsr.hpp"
akmhoque674b0b12014-05-20 14:33:28 -050028#include "logger.hpp"
akmhoque53353462014-04-22 08:43:45 -050029
30namespace nlsr {
31
akmhoque674b0b12014-05-20 14:33:28 -050032INIT_LOGGER("AdjacencyList");
33
akmhoquefdbddb12014-05-02 18:35:19 -050034using namespace std;
35
akmhoquec8a10f72014-04-25 18:42:55 -050036AdjacencyList::AdjacencyList()
akmhoque53353462014-04-22 08:43:45 -050037{
38}
39
akmhoquec8a10f72014-04-25 18:42:55 -050040AdjacencyList::~AdjacencyList()
akmhoque53353462014-04-22 08:43:45 -050041{
42}
43
akmhoquefdbddb12014-05-02 18:35:19 -050044int32_t
45AdjacencyList::insert(Adjacent& adjacent)
akmhoque53353462014-04-22 08:43:45 -050046{
akmhoquefdbddb12014-05-02 18:35:19 -050047 std::list<Adjacent>::iterator it = find(adjacent.getName());
akmhoque157b0a42014-05-13 00:26:37 -050048 if (it != m_adjList.end()) {
akmhoque53353462014-04-22 08:43:45 -050049 return -1;
50 }
akmhoquefdbddb12014-05-02 18:35:19 -050051 m_adjList.push_back(adjacent);
akmhoque53353462014-04-22 08:43:45 -050052 return 0;
53}
54
55void
akmhoquefdbddb12014-05-02 18:35:19 -050056AdjacencyList::addAdjacents(AdjacencyList& adl)
akmhoque53353462014-04-22 08:43:45 -050057{
58 for (std::list<Adjacent>::iterator it = adl.getAdjList().begin();
akmhoque157b0a42014-05-13 00:26:37 -050059 it != adl.getAdjList().end(); ++it) {
akmhoque53353462014-04-22 08:43:45 -050060 insert((*it));
61 }
62}
63
Vince Lehmancb76ade2014-08-28 21:24:41 -050064bool
65AdjacencyList::updateAdjacentStatus(const ndn::Name& adjName, Adjacent::Status s)
akmhoque53353462014-04-22 08:43:45 -050066{
67 std::list<Adjacent>::iterator it = find(adjName);
Vince Lehmancb76ade2014-08-28 21:24:41 -050068
akmhoque157b0a42014-05-13 00:26:37 -050069 if (it == m_adjList.end()) {
Vince Lehmancb76ade2014-08-28 21:24:41 -050070 return false;
akmhoque53353462014-04-22 08:43:45 -050071 }
Vince Lehmancb76ade2014-08-28 21:24:41 -050072 else {
73 it->setStatus(s);
74 return true;
75 }
akmhoque53353462014-04-22 08:43:45 -050076}
77
78Adjacent
akmhoque31d1d4b2014-05-05 22:08:14 -050079AdjacencyList::getAdjacent(const ndn::Name& adjName)
akmhoque53353462014-04-22 08:43:45 -050080{
81 Adjacent adj(adjName);
82 std::list<Adjacent>::iterator it = find(adjName);
akmhoque157b0a42014-05-13 00:26:37 -050083 if (it != m_adjList.end()) {
akmhoque53353462014-04-22 08:43:45 -050084 return (*it);
85 }
86 return adj;
87}
88
akmhoquefdbddb12014-05-02 18:35:19 -050089static bool
90compareAdjacent(const Adjacent& adjacent1, const Adjacent& adjacent2)
91{
92 return adjacent1.getName() < adjacent2.getName();
93}
akmhoque53353462014-04-22 08:43:45 -050094
95bool
akmhoquefdbddb12014-05-02 18:35:19 -050096AdjacencyList::operator==(AdjacencyList& adl)
akmhoque53353462014-04-22 08:43:45 -050097{
akmhoque157b0a42014-05-13 00:26:37 -050098 if (getSize() != adl.getSize()) {
akmhoque53353462014-04-22 08:43:45 -050099 return false;
100 }
akmhoquefdbddb12014-05-02 18:35:19 -0500101 m_adjList.sort(compareAdjacent);
102 adl.getAdjList().sort(compareAdjacent);
103 uint32_t equalAdjCount = 0;
104 std::list<Adjacent>& adjList2 = adl.getAdjList();
akmhoque53353462014-04-22 08:43:45 -0500105 std::list<Adjacent>::iterator it1;
106 std::list<Adjacent>::iterator it2;
107 for (it1 = m_adjList.begin(), it2 = adjList2.begin();
akmhoque157b0a42014-05-13 00:26:37 -0500108 it1 != m_adjList.end(); it1++, it2++) {
109 if (!((*it1) == (*it2))) {
akmhoque53353462014-04-22 08:43:45 -0500110 break;
111 }
112 equalAdjCount++;
113 }
114 return equalAdjCount == getSize();
115}
116
akmhoquefdbddb12014-05-02 18:35:19 -0500117int32_t
akmhoque31d1d4b2014-05-05 22:08:14 -0500118AdjacencyList::updateAdjacentLinkCost(const ndn::Name& adjName, double lc)
akmhoque53353462014-04-22 08:43:45 -0500119{
120 std::list<Adjacent>::iterator it = find(adjName);
akmhoque157b0a42014-05-13 00:26:37 -0500121 if (it == m_adjList.end()) {
akmhoque53353462014-04-22 08:43:45 -0500122 return -1;
123 }
124 (*it).setLinkCost(lc);
125 return 0;
126}
127
128bool
akmhoque31d1d4b2014-05-05 22:08:14 -0500129AdjacencyList::isNeighbor(const ndn::Name& adjName)
akmhoque53353462014-04-22 08:43:45 -0500130{
131 std::list<Adjacent>::iterator it = find(adjName);
132 if (it == m_adjList.end())
133 {
134 return false;
135 }
136 return true;
137}
138
139void
akmhoque31d1d4b2014-05-05 22:08:14 -0500140AdjacencyList::incrementTimedOutInterestCount(const ndn::Name& neighbor)
akmhoque53353462014-04-22 08:43:45 -0500141{
142 std::list<Adjacent>::iterator it = find(neighbor);
akmhoque157b0a42014-05-13 00:26:37 -0500143 if (it == m_adjList.end()) {
akmhoque53353462014-04-22 08:43:45 -0500144 return ;
145 }
146 (*it).setInterestTimedOutNo((*it).getInterestTimedOutNo() + 1);
147}
148
149void
akmhoque31d1d4b2014-05-05 22:08:14 -0500150AdjacencyList::setTimedOutInterestCount(const ndn::Name& neighbor,
151 uint32_t count)
akmhoque53353462014-04-22 08:43:45 -0500152{
153 std::list<Adjacent>::iterator it = find(neighbor);
akmhoque157b0a42014-05-13 00:26:37 -0500154 if (it != m_adjList.end()) {
akmhoque53353462014-04-22 08:43:45 -0500155 (*it).setInterestTimedOutNo(count);
156 }
157}
158
akmhoquefdbddb12014-05-02 18:35:19 -0500159int32_t
akmhoque31d1d4b2014-05-05 22:08:14 -0500160AdjacencyList::getTimedOutInterestCount(const ndn::Name& neighbor)
akmhoque53353462014-04-22 08:43:45 -0500161{
162 std::list<Adjacent>::iterator it = find(neighbor);
akmhoque157b0a42014-05-13 00:26:37 -0500163 if (it == m_adjList.end()) {
akmhoque53353462014-04-22 08:43:45 -0500164 return -1;
165 }
166 return (*it).getInterestTimedOutNo();
167}
168
Vince Lehmancb76ade2014-08-28 21:24:41 -0500169Adjacent::Status
akmhoque31d1d4b2014-05-05 22:08:14 -0500170AdjacencyList::getStatusOfNeighbor(const ndn::Name& neighbor)
akmhoque53353462014-04-22 08:43:45 -0500171{
172 std::list<Adjacent>::iterator it = find(neighbor);
Vince Lehmancb76ade2014-08-28 21:24:41 -0500173
akmhoque157b0a42014-05-13 00:26:37 -0500174 if (it == m_adjList.end()) {
Vince Lehmancb76ade2014-08-28 21:24:41 -0500175 return Adjacent::STATUS_UNKNOWN;
akmhoque53353462014-04-22 08:43:45 -0500176 }
Vince Lehmancb76ade2014-08-28 21:24:41 -0500177 else {
178 return it->getStatus();
179 }
akmhoque53353462014-04-22 08:43:45 -0500180}
181
182void
Vince Lehmancb76ade2014-08-28 21:24:41 -0500183AdjacencyList::setStatusOfNeighbor(const ndn::Name& neighbor, Adjacent::Status status)
akmhoque53353462014-04-22 08:43:45 -0500184{
185 std::list<Adjacent>::iterator it = find(neighbor);
akmhoque157b0a42014-05-13 00:26:37 -0500186 if (it != m_adjList.end()) {
Vince Lehmancb76ade2014-08-28 21:24:41 -0500187 it->setStatus(status);
akmhoque53353462014-04-22 08:43:45 -0500188 }
189}
190
191std::list<Adjacent>&
akmhoquec8a10f72014-04-25 18:42:55 -0500192AdjacencyList::getAdjList()
akmhoque53353462014-04-22 08:43:45 -0500193{
194 return m_adjList;
195}
196
197bool
akmhoquec8a10f72014-04-25 18:42:55 -0500198AdjacencyList::isAdjLsaBuildable(Nlsr& pnlsr)
akmhoque53353462014-04-22 08:43:45 -0500199{
200 uint32_t nbrCount = 0;
Vince Lehmancb76ade2014-08-28 21:24:41 -0500201 for (std::list<Adjacent>::iterator it = m_adjList.begin(); it != m_adjList.end() ; it++) {
202
203 if (it->getStatus() == Adjacent::STATUS_ACTIVE) {
akmhoque53353462014-04-22 08:43:45 -0500204 nbrCount++;
205 }
akmhoque157b0a42014-05-13 00:26:37 -0500206 else {
akmhoque53353462014-04-22 08:43:45 -0500207 if ((*it).getInterestTimedOutNo() >=
akmhoque157b0a42014-05-13 00:26:37 -0500208 pnlsr.getConfParameter().getInterestRetryNumber()) {
akmhoque53353462014-04-22 08:43:45 -0500209 nbrCount++;
210 }
211 }
212 }
akmhoque157b0a42014-05-13 00:26:37 -0500213 if (nbrCount == m_adjList.size()) {
akmhoque53353462014-04-22 08:43:45 -0500214 return true;
215 }
216 return false;
217}
218
akmhoquefdbddb12014-05-02 18:35:19 -0500219int32_t
akmhoquec8a10f72014-04-25 18:42:55 -0500220AdjacencyList::getNumOfActiveNeighbor()
akmhoque53353462014-04-22 08:43:45 -0500221{
akmhoquefdbddb12014-05-02 18:35:19 -0500222 int32_t actNbrCount = 0;
Vince Lehmancb76ade2014-08-28 21:24:41 -0500223 for (std::list<Adjacent>::iterator it = m_adjList.begin(); it != m_adjList.end(); it++) {
224
225 if (it->getStatus() == Adjacent::STATUS_ACTIVE) {
akmhoque53353462014-04-22 08:43:45 -0500226 actNbrCount++;
227 }
228 }
229 return actNbrCount;
230}
231
232std::list<Adjacent>::iterator
akmhoque31d1d4b2014-05-05 22:08:14 -0500233AdjacencyList::find(const ndn::Name& adjName)
akmhoque53353462014-04-22 08:43:45 -0500234{
akmhoque53353462014-04-22 08:43:45 -0500235 std::list<Adjacent>::iterator it = std::find_if(m_adjList.begin(),
236 m_adjList.end(),
akmhoque31d1d4b2014-05-05 22:08:14 -0500237 ndn::bind(&Adjacent::compare,
238 _1, ndn::cref(adjName)));
akmhoque53353462014-04-22 08:43:45 -0500239 return it;
240}
241
akmhoquec04e7272014-07-02 11:00:14 -0500242Adjacent *
243AdjacencyList::findAdjacent(const ndn::Name& adjName)
244{
245 std::list<Adjacent>::iterator it = std::find_if(m_adjList.begin(),
246 m_adjList.end(),
247 ndn::bind(&Adjacent::compare,
248 _1, ndn::cref(adjName)));
249 if (it != m_adjList.end()) {
250 return &(*it);
251 }
252
253 return 0;
254}
255
256Adjacent *
257AdjacencyList::findAdjacent(uint64_t faceId)
258{
259 std::list<Adjacent>::iterator it = std::find_if(m_adjList.begin(),
260 m_adjList.end(),
261 ndn::bind(&Adjacent::compareFaceId,
262 _1, faceId));
263 if (it != m_adjList.end()) {
264 return &(*it);
265 }
266
267 return 0;
268}
269
akmhoque102aea42014-08-04 10:22:12 -0500270uint64_t
271AdjacencyList::getFaceId(const std::string& faceUri)
272{
273 std::list<Adjacent>::iterator it = std::find_if(m_adjList.begin(),
274 m_adjList.end(),
275 ndn::bind(&Adjacent::compareFaceUri,
276 _1, faceUri));
277 if (it != m_adjList.end()) {
278 return it->getFaceId();
279 }
280
281 return 0;
282}
283
akmhoque674b0b12014-05-20 14:33:28 -0500284void
285AdjacencyList::writeLog()
286{
287 _LOG_DEBUG("-------Adjacency List--------");
288 for (std::list<Adjacent>::iterator it = m_adjList.begin();
289 it != m_adjList.end(); it++) {
290 (*it).writeLog();
291 }
292}
293
akmhoque53353462014-04-22 08:43:45 -0500294} //namespace nlsr