blob: 955e668bbf4e37e914b093b6e1b4e503ed3459c9 [file] [log] [blame]
Ashlesh Gawande793e8702017-08-01 15:59:26 -05001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
akmhoque3d06e792014-05-27 16:23:20 -05002/**
Ashlesh Gawande0db4d4d2020-02-05 20:30:02 -08003 * Copyright (c) 2014-2020, The University of Memphis,
alvydce3f182015-04-09 11:23:30 -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 **/
alvydce3f182015-04-09 11:23:30 -050021
akmhoquefdbddb12014-05-02 18:35:19 -050022#ifndef NLSR_ADJACENCY_LIST_HPP
23#define NLSR_ADJACENCY_LIST_HPP
akmhoque53353462014-04-22 08:43:45 -050024
Ashlesh Gawande793e8702017-08-01 15:59:26 -050025#include "adjacent.hpp"
Nick Gordone98480b2017-05-24 11:23:03 -050026#include "common.hpp"
Ashlesh Gawande793e8702017-08-01 15:59:26 -050027
akmhoque53353462014-04-22 08:43:45 -050028#include <list>
akmhoquefdbddb12014-05-02 18:35:19 -050029#include <boost/cstdint.hpp>
akmhoque53353462014-04-22 08:43:45 -050030
31namespace nlsr {
akmhoque53353462014-04-22 08:43:45 -050032
akmhoquec8a10f72014-04-25 18:42:55 -050033class AdjacencyList
akmhoque53353462014-04-22 08:43:45 -050034{
akmhoque53353462014-04-22 08:43:45 -050035public:
alvydce3f182015-04-09 11:23:30 -050036 typedef std::list<Adjacent>::const_iterator const_iterator;
37 typedef std::list<Adjacent>::iterator iterator;
38
Ashlesh Gawande0db4d4d2020-02-05 20:30:02 -080039 bool
akmhoquefdbddb12014-05-02 18:35:19 -050040 insert(Adjacent& adjacent);
akmhoque53353462014-04-22 08:43:45 -050041
akmhoque53353462014-04-22 08:43:45 -050042 std::list<Adjacent>&
43 getAdjList();
44
Nick Gordon22b5c952017-08-10 17:48:15 -050045 const std::list<Adjacent>&
46 getAdjList() const;
47
akmhoque53353462014-04-22 08:43:45 -050048 bool
Nick Gordon49648702018-01-22 11:57:33 -060049 isNeighbor(const ndn::Name& adjName) const;
akmhoque53353462014-04-22 08:43:45 -050050
51 void
akmhoque31d1d4b2014-05-05 22:08:14 -050052 incrementTimedOutInterestCount(const ndn::Name& neighbor);
akmhoque53353462014-04-22 08:43:45 -050053
akmhoquefdbddb12014-05-02 18:35:19 -050054 int32_t
Nick Gordon49648702018-01-22 11:57:33 -060055 getTimedOutInterestCount(const ndn::Name& neighbor) const;
akmhoque53353462014-04-22 08:43:45 -050056
Vince Lehmancb76ade2014-08-28 21:24:41 -050057 Adjacent::Status
Nick Gordon49648702018-01-22 11:57:33 -060058 getStatusOfNeighbor(const ndn::Name& neighbor) const;
akmhoque53353462014-04-22 08:43:45 -050059
60 void
Vince Lehmancb76ade2014-08-28 21:24:41 -050061 setStatusOfNeighbor(const ndn::Name& neighbor, Adjacent::Status status);
akmhoque53353462014-04-22 08:43:45 -050062
63 void
akmhoque31d1d4b2014-05-05 22:08:14 -050064 setTimedOutInterestCount(const ndn::Name& neighbor, uint32_t count);
akmhoque53353462014-04-22 08:43:45 -050065
Nick G97e34942016-07-11 14:46:27 -050066 /*! \brief Determines whether this list can be used to build an adj. LSA.
67 \param interestRetryNo The maximum number of hello-interest
68 retries to contact a neighbor.
69
70 \return Returns a boolean indicating whether this list can be used
71 to build an adj. LSA.
72
73 Determines whether this adjacency list object could be used to
74 build an adjacency LSA. An LSA is buildable when the status of all
75 neighbors is known. A neighbor's status is known when their status
76 is ACTIVE, or INACTIVE and some number of hello interests
77 (specified by nlsr::ConfParameter::getInterestRetryNumber()) have
78 failed. To be explicit, a neighbor's status is unknown if we are
79 still sending hello interests.
80 */
akmhoque53353462014-04-22 08:43:45 -050081 bool
Vince Lehmanf7eec4f2015-05-08 19:02:31 -050082 isAdjLsaBuildable(const uint32_t interestRetryNo) const;
akmhoque53353462014-04-22 08:43:45 -050083
akmhoquefdbddb12014-05-02 18:35:19 -050084 int32_t
Nick Gordon49648702018-01-22 11:57:33 -060085 getNumOfActiveNeighbor() const;
akmhoque53353462014-04-22 08:43:45 -050086
87 Adjacent
akmhoque31d1d4b2014-05-05 22:08:14 -050088 getAdjacent(const ndn::Name& adjName);
akmhoque53353462014-04-22 08:43:45 -050089
90 bool
Nick Gordon49648702018-01-22 11:57:33 -060091 operator==(const AdjacencyList& adl) const;
akmhoque53353462014-04-22 08:43:45 -050092
akmhoquefdbddb12014-05-02 18:35:19 -050093 size_t
Nick Gordonff9a6272017-10-12 13:38:29 -050094 size() const
akmhoque53353462014-04-22 08:43:45 -050095 {
96 return m_adjList.size();
97 }
98
99 void
100 reset()
101 {
Ashlesh Gawande0db4d4d2020-02-05 20:30:02 -0800102 m_adjList.clear();
akmhoque53353462014-04-22 08:43:45 -0500103 }
104
Nick Gordonc780a692017-04-27 18:03:02 -0500105 AdjacencyList::iterator
akmhoquec04e7272014-07-02 11:00:14 -0500106 findAdjacent(const ndn::Name& adjName);
107
Nick Gordonc780a692017-04-27 18:03:02 -0500108 AdjacencyList::iterator
akmhoquec04e7272014-07-02 11:00:14 -0500109 findAdjacent(uint64_t faceId);
110
Nick Gordone9733ed2017-04-26 10:48:39 -0500111 AdjacencyList::iterator
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500112 findAdjacent(const ndn::FaceUri& faceUri);
Nick Gordone9733ed2017-04-26 10:48:39 -0500113
Ashlesh Gawande793e8702017-08-01 15:59:26 -0500114 /*! \brief Hack to stop developers from using this function
115
116 It is here so that faceUri cannot be passed in as string,
117 converted to Name and findAdjacent(Name) be used.
118 So when faceUri is passed as string this will cause a compile error
119 */
120 template <typename T = float> void
121 findAdjacent(const std::string& faceUri)
122 {
123 BOOST_STATIC_ASSERT_MSG(std::is_integral<T>::value,
124 "Don't use std::string with findAdjacent!");
125 }
126
akmhoque102aea42014-08-04 10:22:12 -0500127 uint64_t
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500128 getFaceId(const ndn::FaceUri& faceUri);
akmhoque102aea42014-08-04 10:22:12 -0500129
akmhoque53353462014-04-22 08:43:45 -0500130 void
akmhoque674b0b12014-05-20 14:33:28 -0500131 writeLog();
132
alvydce3f182015-04-09 11:23:30 -0500133public:
134 const_iterator
135 begin() const
136 {
137 return m_adjList.begin();
138 }
139
140 const_iterator
141 end() const
142 {
143 return m_adjList.end();
144 }
145
akmhoque53353462014-04-22 08:43:45 -0500146private:
alvydce3f182015-04-09 11:23:30 -0500147 iterator
akmhoque31d1d4b2014-05-05 22:08:14 -0500148 find(const ndn::Name& adjName);
akmhoque53353462014-04-22 08:43:45 -0500149
Nick Gordon49648702018-01-22 11:57:33 -0600150 const_iterator
151 find(const ndn::Name& adjName) const;
152
akmhoque53353462014-04-22 08:43:45 -0500153private:
154 std::list<Adjacent> m_adjList;
155};
156
Nick Gordonfad8e252016-08-11 14:21:38 -0500157} // namespace nlsr
Nick Gordonc780a692017-04-27 18:03:02 -0500158#endif // NLSR_ADJACENCY_LIST_HPP