blob: b83a982dd29bd08af14246cff85e113dc218d404 [file] [log] [blame]
akmhoque3d06e792014-05-27 16:23:20 -05001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Ashlesh Gawande0db4d4d2020-02-05 20:30:02 -08003 * Copyright (c) 2014-2020, The University of Memphis,
Vince Lehmanf7eec4f2015-05-08 19:02:31 -05004 * 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 Lehman0a7da612014-10-29 14:39:29 -050021
akmhoquec8a10f72014-04-25 18:42:55 -050022#include "adjacency-list.hpp"
Vince Lehmanf7eec4f2015-05-08 19:02:31 -050023
akmhoque53353462014-04-22 08:43:45 -050024#include "adjacent.hpp"
Vince Lehman0a7da612014-10-29 14:39:29 -050025#include "common.hpp"
akmhoque674b0b12014-05-20 14:33:28 -050026#include "logger.hpp"
akmhoque53353462014-04-22 08:43:45 -050027
Vince Lehmanf7eec4f2015-05-08 19:02:31 -050028#include <algorithm>
29
akmhoque53353462014-04-22 08:43:45 -050030namespace nlsr {
31
dmcoomescf8d0ed2017-02-21 11:39:01 -060032INIT_LOGGER(AdjacencyList);
akmhoque674b0b12014-05-20 14:33:28 -050033
Ashlesh Gawande0db4d4d2020-02-05 20:30:02 -080034bool
akmhoquefdbddb12014-05-02 18:35:19 -050035AdjacencyList::insert(Adjacent& adjacent)
akmhoque53353462014-04-22 08:43:45 -050036{
akmhoquefdbddb12014-05-02 18:35:19 -050037 std::list<Adjacent>::iterator it = find(adjacent.getName());
akmhoque157b0a42014-05-13 00:26:37 -050038 if (it != m_adjList.end()) {
Ashlesh Gawande0db4d4d2020-02-05 20:30:02 -080039 return false;
akmhoque53353462014-04-22 08:43:45 -050040 }
akmhoquefdbddb12014-05-02 18:35:19 -050041 m_adjList.push_back(adjacent);
Ashlesh Gawande0db4d4d2020-02-05 20:30:02 -080042 return true;
akmhoque53353462014-04-22 08:43:45 -050043}
44
akmhoque53353462014-04-22 08:43:45 -050045Adjacent
akmhoque31d1d4b2014-05-05 22:08:14 -050046AdjacencyList::getAdjacent(const ndn::Name& adjName)
akmhoque53353462014-04-22 08:43:45 -050047{
48 Adjacent adj(adjName);
49 std::list<Adjacent>::iterator it = find(adjName);
akmhoque157b0a42014-05-13 00:26:37 -050050 if (it != m_adjList.end()) {
akmhoque53353462014-04-22 08:43:45 -050051 return (*it);
52 }
53 return adj;
54}
55
akmhoque53353462014-04-22 08:43:45 -050056bool
Nick Gordon49648702018-01-22 11:57:33 -060057AdjacencyList::operator==(const AdjacencyList& adl) const
akmhoque53353462014-04-22 08:43:45 -050058{
Ashlesh Gawandee8d8bd52018-08-09 17:18:51 -050059 auto theirList = adl.getAdjList();
60 if (m_adjList.size() != theirList.size()) {
akmhoque53353462014-04-22 08:43:45 -050061 return false;
62 }
Nick Gordon2a1ac612017-10-06 15:36:49 -050063
Ashlesh Gawandee8d8bd52018-08-09 17:18:51 -050064 std::set<Adjacent> ourSet(m_adjList.cbegin(), m_adjList.cend());
65 std::set<Adjacent> theirSet(theirList.cbegin(), theirList.cend());
Nick Gordon2a1ac612017-10-06 15:36:49 -050066
Ashlesh Gawandee8d8bd52018-08-09 17:18:51 -050067 return ourSet == theirSet;
akmhoque53353462014-04-22 08:43:45 -050068}
69
akmhoque53353462014-04-22 08:43:45 -050070bool
Nick Gordon49648702018-01-22 11:57:33 -060071AdjacencyList::isNeighbor(const ndn::Name& adjName) const
akmhoque53353462014-04-22 08:43:45 -050072{
Nick Gordon49648702018-01-22 11:57:33 -060073 std::list<Adjacent>::const_iterator it = find(adjName);
akmhoque53353462014-04-22 08:43:45 -050074 if (it == m_adjList.end())
75 {
76 return false;
77 }
78 return true;
79}
80
81void
akmhoque31d1d4b2014-05-05 22:08:14 -050082AdjacencyList::incrementTimedOutInterestCount(const ndn::Name& neighbor)
akmhoque53353462014-04-22 08:43:45 -050083{
84 std::list<Adjacent>::iterator it = find(neighbor);
akmhoque157b0a42014-05-13 00:26:37 -050085 if (it == m_adjList.end()) {
akmhoque53353462014-04-22 08:43:45 -050086 return ;
87 }
88 (*it).setInterestTimedOutNo((*it).getInterestTimedOutNo() + 1);
89}
90
91void
akmhoque31d1d4b2014-05-05 22:08:14 -050092AdjacencyList::setTimedOutInterestCount(const ndn::Name& neighbor,
93 uint32_t count)
akmhoque53353462014-04-22 08:43:45 -050094{
95 std::list<Adjacent>::iterator it = find(neighbor);
akmhoque157b0a42014-05-13 00:26:37 -050096 if (it != m_adjList.end()) {
akmhoque53353462014-04-22 08:43:45 -050097 (*it).setInterestTimedOutNo(count);
98 }
99}
100
akmhoquefdbddb12014-05-02 18:35:19 -0500101int32_t
Nick Gordon49648702018-01-22 11:57:33 -0600102AdjacencyList::getTimedOutInterestCount(const ndn::Name& neighbor) const
akmhoque53353462014-04-22 08:43:45 -0500103{
Nick Gordon49648702018-01-22 11:57:33 -0600104 std::list<Adjacent>::const_iterator it = find(neighbor);
akmhoque157b0a42014-05-13 00:26:37 -0500105 if (it == m_adjList.end()) {
akmhoque53353462014-04-22 08:43:45 -0500106 return -1;
107 }
108 return (*it).getInterestTimedOutNo();
109}
110
Vince Lehmancb76ade2014-08-28 21:24:41 -0500111Adjacent::Status
Nick Gordon49648702018-01-22 11:57:33 -0600112AdjacencyList::getStatusOfNeighbor(const ndn::Name& neighbor) const
akmhoque53353462014-04-22 08:43:45 -0500113{
Nick Gordon49648702018-01-22 11:57:33 -0600114 std::list<Adjacent>::const_iterator it = find(neighbor);
Vince Lehmancb76ade2014-08-28 21:24:41 -0500115
akmhoque157b0a42014-05-13 00:26:37 -0500116 if (it == m_adjList.end()) {
Vince Lehmancb76ade2014-08-28 21:24:41 -0500117 return Adjacent::STATUS_UNKNOWN;
akmhoque53353462014-04-22 08:43:45 -0500118 }
Vince Lehmancb76ade2014-08-28 21:24:41 -0500119 else {
120 return it->getStatus();
121 }
akmhoque53353462014-04-22 08:43:45 -0500122}
123
124void
Vince Lehmancb76ade2014-08-28 21:24:41 -0500125AdjacencyList::setStatusOfNeighbor(const ndn::Name& neighbor, Adjacent::Status status)
akmhoque53353462014-04-22 08:43:45 -0500126{
127 std::list<Adjacent>::iterator it = find(neighbor);
akmhoque157b0a42014-05-13 00:26:37 -0500128 if (it != m_adjList.end()) {
Vince Lehmancb76ade2014-08-28 21:24:41 -0500129 it->setStatus(status);
akmhoque53353462014-04-22 08:43:45 -0500130 }
131}
132
133std::list<Adjacent>&
akmhoquec8a10f72014-04-25 18:42:55 -0500134AdjacencyList::getAdjList()
akmhoque53353462014-04-22 08:43:45 -0500135{
136 return m_adjList;
137}
138
Nick Gordon22b5c952017-08-10 17:48:15 -0500139const std::list<Adjacent>&
140AdjacencyList::getAdjList() const
141{
142 return m_adjList;
143}
144
akmhoque53353462014-04-22 08:43:45 -0500145bool
Vince Lehmanf7eec4f2015-05-08 19:02:31 -0500146AdjacencyList::isAdjLsaBuildable(const uint32_t interestRetryNo) const
akmhoque53353462014-04-22 08:43:45 -0500147{
Vince Lehmanf7eec4f2015-05-08 19:02:31 -0500148 uint32_t nTimedOutNeighbors = 0;
Vince Lehmancb76ade2014-08-28 21:24:41 -0500149
Vince Lehmanf7eec4f2015-05-08 19:02:31 -0500150 for (const Adjacent& adjacency : m_adjList) {
151
152 if (adjacency.getStatus() == Adjacent::STATUS_ACTIVE) {
153 return true;
akmhoque53353462014-04-22 08:43:45 -0500154 }
Vince Lehmanf7eec4f2015-05-08 19:02:31 -0500155 else if (adjacency.getInterestTimedOutNo() >= interestRetryNo) {
156 nTimedOutNeighbors++;
akmhoque53353462014-04-22 08:43:45 -0500157 }
158 }
Vince Lehmanf7eec4f2015-05-08 19:02:31 -0500159
160 if (nTimedOutNeighbors == m_adjList.size()) {
akmhoque53353462014-04-22 08:43:45 -0500161 return true;
162 }
Vince Lehmanf7eec4f2015-05-08 19:02:31 -0500163 else {
164 return false;
165 }
akmhoque53353462014-04-22 08:43:45 -0500166}
167
akmhoquefdbddb12014-05-02 18:35:19 -0500168int32_t
Nick Gordon49648702018-01-22 11:57:33 -0600169AdjacencyList::getNumOfActiveNeighbor() const
akmhoque53353462014-04-22 08:43:45 -0500170{
akmhoquefdbddb12014-05-02 18:35:19 -0500171 int32_t actNbrCount = 0;
Ashlesh Gawande6b388fc2019-09-30 10:14:41 -0500172 for (const auto& adjacent: m_adjList) {
173 if (adjacent.getStatus() == Adjacent::STATUS_ACTIVE) {
akmhoque53353462014-04-22 08:43:45 -0500174 actNbrCount++;
175 }
176 }
177 return actNbrCount;
178}
179
180std::list<Adjacent>::iterator
akmhoque31d1d4b2014-05-05 22:08:14 -0500181AdjacencyList::find(const ndn::Name& adjName)
akmhoque53353462014-04-22 08:43:45 -0500182{
Ashlesh Gawande6b388fc2019-09-30 10:14:41 -0500183 return std::find_if(m_adjList.begin(),
184 m_adjList.end(),
185 std::bind(&Adjacent::compare, _1, std::cref(adjName)));
akmhoque53353462014-04-22 08:43:45 -0500186}
187
Nick Gordon49648702018-01-22 11:57:33 -0600188std::list<Adjacent>::const_iterator
189AdjacencyList::find(const ndn::Name& adjName) const
190{
Ashlesh Gawande6b388fc2019-09-30 10:14:41 -0500191 return std::find_if(m_adjList.cbegin(),
192 m_adjList.cend(),
193 std::bind(&Adjacent::compare, _1, std::cref(adjName)));
Nick Gordon49648702018-01-22 11:57:33 -0600194}
195
Nick Gordonc780a692017-04-27 18:03:02 -0500196AdjacencyList::iterator
akmhoquec04e7272014-07-02 11:00:14 -0500197AdjacencyList::findAdjacent(const ndn::Name& adjName)
198{
Nick Gordonc780a692017-04-27 18:03:02 -0500199 return std::find_if(m_adjList.begin(),
200 m_adjList.end(),
201 std::bind(&Adjacent::compare,
202 _1, std::cref(adjName)));
akmhoquec04e7272014-07-02 11:00:14 -0500203}
204
Nick Gordonc780a692017-04-27 18:03:02 -0500205AdjacencyList::iterator
akmhoquec04e7272014-07-02 11:00:14 -0500206AdjacencyList::findAdjacent(uint64_t faceId)
207{
Nick Gordonc780a692017-04-27 18:03:02 -0500208 return std::find_if(m_adjList.begin(),
209 m_adjList.end(),
210 std::bind(&Adjacent::compareFaceId,
211 _1, faceId));
akmhoquec04e7272014-07-02 11:00:14 -0500212}
213
Nick Gordone9733ed2017-04-26 10:48:39 -0500214AdjacencyList::iterator
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500215AdjacencyList::findAdjacent(const ndn::FaceUri& faceUri)
Nick Gordone9733ed2017-04-26 10:48:39 -0500216{
217 return std::find_if(m_adjList.begin(),
218 m_adjList.end(),
Ashlesh Gawande793e8702017-08-01 15:59:26 -0500219 std::bind(&Adjacent::compareFaceUri,
220 _1, faceUri));
Nick Gordone9733ed2017-04-26 10:48:39 -0500221}
222
akmhoque102aea42014-08-04 10:22:12 -0500223uint64_t
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500224AdjacencyList::getFaceId(const ndn::FaceUri& faceUri)
akmhoque102aea42014-08-04 10:22:12 -0500225{
226 std::list<Adjacent>::iterator it = std::find_if(m_adjList.begin(),
227 m_adjList.end(),
dmcoomes9f936662017-03-02 10:33:09 -0600228 std::bind(&Adjacent::compareFaceUri,
akmhoque102aea42014-08-04 10:22:12 -0500229 _1, faceUri));
akmhoque102aea42014-08-04 10:22:12 -0500230
Ashlesh Gawande6b388fc2019-09-30 10:14:41 -0500231 return it != m_adjList.end() ? it->getFaceId() : 0;
akmhoque102aea42014-08-04 10:22:12 -0500232}
233
akmhoque674b0b12014-05-20 14:33:28 -0500234void
235AdjacencyList::writeLog()
236{
dmcoomes5bcb39e2017-10-31 15:07:55 -0500237 NLSR_LOG_DEBUG("-------Adjacency List--------");
Ashlesh Gawande6b388fc2019-09-30 10:14:41 -0500238 for (const auto& adjacent : m_adjList) {
239 NLSR_LOG_DEBUG(adjacent);
akmhoque674b0b12014-05-20 14:33:28 -0500240 }
241}
242
Nick Gordonfad8e252016-08-11 14:21:38 -0500243} // namespace nlsr