blob: 302d9b9196163524fa9aedda4c65cc25dad99e6a [file] [log] [blame]
akmhoque3d06e792014-05-27 16:23:20 -05001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Davide Pesaventod90338d2021-01-07 17:50:05 -05002/*
3 * Copyright (c) 2014-2021, 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"
akmhoque674b0b12014-05-20 14:33:28 -050023#include "logger.hpp"
akmhoque53353462014-04-22 08:43:45 -050024
Vince Lehmanf7eec4f2015-05-08 19:02:31 -050025#include <algorithm>
26
akmhoque53353462014-04-22 08:43:45 -050027namespace nlsr {
28
dmcoomescf8d0ed2017-02-21 11:39:01 -060029INIT_LOGGER(AdjacencyList);
akmhoque674b0b12014-05-20 14:33:28 -050030
Ashlesh Gawande0db4d4d2020-02-05 20:30:02 -080031bool
Davide Pesaventod90338d2021-01-07 17:50:05 -050032AdjacencyList::insert(const Adjacent& adjacent)
akmhoque53353462014-04-22 08:43:45 -050033{
Davide Pesaventod90338d2021-01-07 17:50:05 -050034 auto it = find(adjacent.getName());
akmhoque157b0a42014-05-13 00:26:37 -050035 if (it != m_adjList.end()) {
Ashlesh Gawande0db4d4d2020-02-05 20:30:02 -080036 return false;
akmhoque53353462014-04-22 08:43:45 -050037 }
akmhoquefdbddb12014-05-02 18:35:19 -050038 m_adjList.push_back(adjacent);
Ashlesh Gawande0db4d4d2020-02-05 20:30:02 -080039 return true;
akmhoque53353462014-04-22 08:43:45 -050040}
41
akmhoque53353462014-04-22 08:43:45 -050042Adjacent
akmhoque31d1d4b2014-05-05 22:08:14 -050043AdjacencyList::getAdjacent(const ndn::Name& adjName)
akmhoque53353462014-04-22 08:43:45 -050044{
45 Adjacent adj(adjName);
46 std::list<Adjacent>::iterator it = find(adjName);
akmhoque157b0a42014-05-13 00:26:37 -050047 if (it != m_adjList.end()) {
akmhoque53353462014-04-22 08:43:45 -050048 return (*it);
49 }
50 return adj;
51}
52
akmhoque53353462014-04-22 08:43:45 -050053bool
Nick Gordon49648702018-01-22 11:57:33 -060054AdjacencyList::operator==(const AdjacencyList& adl) const
akmhoque53353462014-04-22 08:43:45 -050055{
Ashlesh Gawandee8d8bd52018-08-09 17:18:51 -050056 auto theirList = adl.getAdjList();
57 if (m_adjList.size() != theirList.size()) {
akmhoque53353462014-04-22 08:43:45 -050058 return false;
59 }
Nick Gordon2a1ac612017-10-06 15:36:49 -050060
Ashlesh Gawandee8d8bd52018-08-09 17:18:51 -050061 std::set<Adjacent> ourSet(m_adjList.cbegin(), m_adjList.cend());
62 std::set<Adjacent> theirSet(theirList.cbegin(), theirList.cend());
Nick Gordon2a1ac612017-10-06 15:36:49 -050063
Ashlesh Gawandee8d8bd52018-08-09 17:18:51 -050064 return ourSet == theirSet;
akmhoque53353462014-04-22 08:43:45 -050065}
66
akmhoque53353462014-04-22 08:43:45 -050067bool
Nick Gordon49648702018-01-22 11:57:33 -060068AdjacencyList::isNeighbor(const ndn::Name& adjName) const
akmhoque53353462014-04-22 08:43:45 -050069{
Nick Gordon49648702018-01-22 11:57:33 -060070 std::list<Adjacent>::const_iterator it = find(adjName);
akmhoque53353462014-04-22 08:43:45 -050071 if (it == m_adjList.end())
72 {
73 return false;
74 }
75 return true;
76}
77
78void
akmhoque31d1d4b2014-05-05 22:08:14 -050079AdjacencyList::incrementTimedOutInterestCount(const ndn::Name& neighbor)
akmhoque53353462014-04-22 08:43:45 -050080{
81 std::list<Adjacent>::iterator it = find(neighbor);
akmhoque157b0a42014-05-13 00:26:37 -050082 if (it == m_adjList.end()) {
akmhoque53353462014-04-22 08:43:45 -050083 return ;
84 }
85 (*it).setInterestTimedOutNo((*it).getInterestTimedOutNo() + 1);
86}
87
88void
akmhoque31d1d4b2014-05-05 22:08:14 -050089AdjacencyList::setTimedOutInterestCount(const ndn::Name& neighbor,
90 uint32_t count)
akmhoque53353462014-04-22 08:43:45 -050091{
92 std::list<Adjacent>::iterator it = find(neighbor);
akmhoque157b0a42014-05-13 00:26:37 -050093 if (it != m_adjList.end()) {
akmhoque53353462014-04-22 08:43:45 -050094 (*it).setInterestTimedOutNo(count);
95 }
96}
97
akmhoquefdbddb12014-05-02 18:35:19 -050098int32_t
Nick Gordon49648702018-01-22 11:57:33 -060099AdjacencyList::getTimedOutInterestCount(const ndn::Name& neighbor) const
akmhoque53353462014-04-22 08:43:45 -0500100{
Nick Gordon49648702018-01-22 11:57:33 -0600101 std::list<Adjacent>::const_iterator it = find(neighbor);
akmhoque157b0a42014-05-13 00:26:37 -0500102 if (it == m_adjList.end()) {
akmhoque53353462014-04-22 08:43:45 -0500103 return -1;
104 }
105 return (*it).getInterestTimedOutNo();
106}
107
Vince Lehmancb76ade2014-08-28 21:24:41 -0500108Adjacent::Status
Nick Gordon49648702018-01-22 11:57:33 -0600109AdjacencyList::getStatusOfNeighbor(const ndn::Name& neighbor) const
akmhoque53353462014-04-22 08:43:45 -0500110{
Nick Gordon49648702018-01-22 11:57:33 -0600111 std::list<Adjacent>::const_iterator it = find(neighbor);
Vince Lehmancb76ade2014-08-28 21:24:41 -0500112
akmhoque157b0a42014-05-13 00:26:37 -0500113 if (it == m_adjList.end()) {
Vince Lehmancb76ade2014-08-28 21:24:41 -0500114 return Adjacent::STATUS_UNKNOWN;
akmhoque53353462014-04-22 08:43:45 -0500115 }
Vince Lehmancb76ade2014-08-28 21:24:41 -0500116 else {
117 return it->getStatus();
118 }
akmhoque53353462014-04-22 08:43:45 -0500119}
120
121void
Vince Lehmancb76ade2014-08-28 21:24:41 -0500122AdjacencyList::setStatusOfNeighbor(const ndn::Name& neighbor, Adjacent::Status status)
akmhoque53353462014-04-22 08:43:45 -0500123{
124 std::list<Adjacent>::iterator it = find(neighbor);
akmhoque157b0a42014-05-13 00:26:37 -0500125 if (it != m_adjList.end()) {
Vince Lehmancb76ade2014-08-28 21:24:41 -0500126 it->setStatus(status);
akmhoque53353462014-04-22 08:43:45 -0500127 }
128}
129
130std::list<Adjacent>&
akmhoquec8a10f72014-04-25 18:42:55 -0500131AdjacencyList::getAdjList()
akmhoque53353462014-04-22 08:43:45 -0500132{
133 return m_adjList;
134}
135
Nick Gordon22b5c952017-08-10 17:48:15 -0500136const std::list<Adjacent>&
137AdjacencyList::getAdjList() const
138{
139 return m_adjList;
140}
141
akmhoque53353462014-04-22 08:43:45 -0500142bool
Vince Lehmanf7eec4f2015-05-08 19:02:31 -0500143AdjacencyList::isAdjLsaBuildable(const uint32_t interestRetryNo) const
akmhoque53353462014-04-22 08:43:45 -0500144{
Vince Lehmanf7eec4f2015-05-08 19:02:31 -0500145 uint32_t nTimedOutNeighbors = 0;
Vince Lehmancb76ade2014-08-28 21:24:41 -0500146
Vince Lehmanf7eec4f2015-05-08 19:02:31 -0500147 for (const Adjacent& adjacency : m_adjList) {
148
149 if (adjacency.getStatus() == Adjacent::STATUS_ACTIVE) {
150 return true;
akmhoque53353462014-04-22 08:43:45 -0500151 }
Vince Lehmanf7eec4f2015-05-08 19:02:31 -0500152 else if (adjacency.getInterestTimedOutNo() >= interestRetryNo) {
153 nTimedOutNeighbors++;
akmhoque53353462014-04-22 08:43:45 -0500154 }
155 }
Vince Lehmanf7eec4f2015-05-08 19:02:31 -0500156
157 if (nTimedOutNeighbors == m_adjList.size()) {
akmhoque53353462014-04-22 08:43:45 -0500158 return true;
159 }
Vince Lehmanf7eec4f2015-05-08 19:02:31 -0500160 else {
161 return false;
162 }
akmhoque53353462014-04-22 08:43:45 -0500163}
164
akmhoquefdbddb12014-05-02 18:35:19 -0500165int32_t
Nick Gordon49648702018-01-22 11:57:33 -0600166AdjacencyList::getNumOfActiveNeighbor() const
akmhoque53353462014-04-22 08:43:45 -0500167{
akmhoquefdbddb12014-05-02 18:35:19 -0500168 int32_t actNbrCount = 0;
Ashlesh Gawande6b388fc2019-09-30 10:14:41 -0500169 for (const auto& adjacent: m_adjList) {
170 if (adjacent.getStatus() == Adjacent::STATUS_ACTIVE) {
akmhoque53353462014-04-22 08:43:45 -0500171 actNbrCount++;
172 }
173 }
174 return actNbrCount;
175}
176
177std::list<Adjacent>::iterator
akmhoque31d1d4b2014-05-05 22:08:14 -0500178AdjacencyList::find(const ndn::Name& adjName)
akmhoque53353462014-04-22 08:43:45 -0500179{
Ashlesh Gawande6b388fc2019-09-30 10:14:41 -0500180 return std::find_if(m_adjList.begin(),
181 m_adjList.end(),
182 std::bind(&Adjacent::compare, _1, std::cref(adjName)));
akmhoque53353462014-04-22 08:43:45 -0500183}
184
Nick Gordon49648702018-01-22 11:57:33 -0600185std::list<Adjacent>::const_iterator
186AdjacencyList::find(const ndn::Name& adjName) const
187{
Ashlesh Gawande6b388fc2019-09-30 10:14:41 -0500188 return std::find_if(m_adjList.cbegin(),
189 m_adjList.cend(),
190 std::bind(&Adjacent::compare, _1, std::cref(adjName)));
Nick Gordon49648702018-01-22 11:57:33 -0600191}
192
Nick Gordonc780a692017-04-27 18:03:02 -0500193AdjacencyList::iterator
akmhoquec04e7272014-07-02 11:00:14 -0500194AdjacencyList::findAdjacent(const ndn::Name& adjName)
195{
Nick Gordonc780a692017-04-27 18:03:02 -0500196 return std::find_if(m_adjList.begin(),
197 m_adjList.end(),
198 std::bind(&Adjacent::compare,
199 _1, std::cref(adjName)));
akmhoquec04e7272014-07-02 11:00:14 -0500200}
201
Nick Gordonc780a692017-04-27 18:03:02 -0500202AdjacencyList::iterator
akmhoquec04e7272014-07-02 11:00:14 -0500203AdjacencyList::findAdjacent(uint64_t faceId)
204{
Nick Gordonc780a692017-04-27 18:03:02 -0500205 return std::find_if(m_adjList.begin(),
206 m_adjList.end(),
207 std::bind(&Adjacent::compareFaceId,
208 _1, faceId));
akmhoquec04e7272014-07-02 11:00:14 -0500209}
210
Nick Gordone9733ed2017-04-26 10:48:39 -0500211AdjacencyList::iterator
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500212AdjacencyList::findAdjacent(const ndn::FaceUri& faceUri)
Nick Gordone9733ed2017-04-26 10:48:39 -0500213{
214 return std::find_if(m_adjList.begin(),
215 m_adjList.end(),
Ashlesh Gawande793e8702017-08-01 15:59:26 -0500216 std::bind(&Adjacent::compareFaceUri,
217 _1, faceUri));
Nick Gordone9733ed2017-04-26 10:48:39 -0500218}
219
akmhoque102aea42014-08-04 10:22:12 -0500220uint64_t
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500221AdjacencyList::getFaceId(const ndn::FaceUri& faceUri)
akmhoque102aea42014-08-04 10:22:12 -0500222{
223 std::list<Adjacent>::iterator it = std::find_if(m_adjList.begin(),
224 m_adjList.end(),
dmcoomes9f936662017-03-02 10:33:09 -0600225 std::bind(&Adjacent::compareFaceUri,
akmhoque102aea42014-08-04 10:22:12 -0500226 _1, faceUri));
akmhoque102aea42014-08-04 10:22:12 -0500227
Ashlesh Gawande6b388fc2019-09-30 10:14:41 -0500228 return it != m_adjList.end() ? it->getFaceId() : 0;
akmhoque102aea42014-08-04 10:22:12 -0500229}
230
akmhoque674b0b12014-05-20 14:33:28 -0500231void
232AdjacencyList::writeLog()
233{
dmcoomes5bcb39e2017-10-31 15:07:55 -0500234 NLSR_LOG_DEBUG("-------Adjacency List--------");
Ashlesh Gawande6b388fc2019-09-30 10:14:41 -0500235 for (const auto& adjacent : m_adjList) {
236 NLSR_LOG_DEBUG(adjacent);
akmhoque674b0b12014-05-20 14:33:28 -0500237 }
238}
239
Nick Gordonfad8e252016-08-11 14:21:38 -0500240} // namespace nlsr