blob: 4cf816e44e10d3b3ccd4ed73501f6bd7212ec5b3 [file] [log] [blame]
Nick G97e34942016-07-11 14:46:27 -05001 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
akmhoque3d06e792014-05-27 16:23:20 -05002/**
Nick Gordonc6a85222017-01-03 16:54:34 -06003 * Copyright (c) 2014-2017, 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
akmhoque53353462014-04-22 08:43:45 -050025#include <list>
akmhoquefdbddb12014-05-02 18:35:19 -050026#include <boost/cstdint.hpp>
27#include <ndn-cxx/common.hpp>
akmhoque53353462014-04-22 08:43:45 -050028
akmhoquec8a10f72014-04-25 18:42:55 -050029#include "adjacent.hpp"
30
akmhoque53353462014-04-22 08:43:45 -050031namespace 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
akmhoquec8a10f72014-04-25 18:42:55 -050039 AdjacencyList();
40 ~AdjacencyList();
akmhoque53353462014-04-22 08:43:45 -050041
Nick G97e34942016-07-11 14:46:27 -050042 /*! \brief Inserts an adjacency into the list.
43
44 \param adjacent The adjacency that we want to add to this list.
45
46 \retval 0 Indicates success.
47 \retval 1 Indicates failure.
48
49 This function attempts to insert the supplied adjacency into this
50 object, which is an adjacency list.
51 */
akmhoquefdbddb12014-05-02 18:35:19 -050052 int32_t
53 insert(Adjacent& adjacent);
akmhoque53353462014-04-22 08:43:45 -050054
Nick G97e34942016-07-11 14:46:27 -050055 /*! \brief Sets the status of an adjacency.
56
57 \param adjName The adjacency in this list you want to change the status of.
58
59 \param s The status to change to.
60
61 \return A boolean indicating whether an adjacency was
62 updated. This is false if s is not in the list.
63 */
Vince Lehmancb76ade2014-08-28 21:24:41 -050064 bool
65 updateAdjacentStatus(const ndn::Name& adjName, Adjacent::Status s);
akmhoque53353462014-04-22 08:43:45 -050066
akmhoquefdbddb12014-05-02 18:35:19 -050067 int32_t
akmhoque31d1d4b2014-05-05 22:08:14 -050068 updateAdjacentLinkCost(const ndn::Name& adjName, double lc);
akmhoque53353462014-04-22 08:43:45 -050069
70 std::list<Adjacent>&
71 getAdjList();
72
73 bool
akmhoque31d1d4b2014-05-05 22:08:14 -050074 isNeighbor(const ndn::Name& adjName);
akmhoque53353462014-04-22 08:43:45 -050075
76 void
akmhoque31d1d4b2014-05-05 22:08:14 -050077 incrementTimedOutInterestCount(const ndn::Name& neighbor);
akmhoque53353462014-04-22 08:43:45 -050078
akmhoquefdbddb12014-05-02 18:35:19 -050079 int32_t
akmhoque31d1d4b2014-05-05 22:08:14 -050080 getTimedOutInterestCount(const ndn::Name& neighbor);
akmhoque53353462014-04-22 08:43:45 -050081
Vince Lehmancb76ade2014-08-28 21:24:41 -050082 Adjacent::Status
akmhoque31d1d4b2014-05-05 22:08:14 -050083 getStatusOfNeighbor(const ndn::Name& neighbor);
akmhoque53353462014-04-22 08:43:45 -050084
85 void
Vince Lehmancb76ade2014-08-28 21:24:41 -050086 setStatusOfNeighbor(const ndn::Name& neighbor, Adjacent::Status status);
akmhoque53353462014-04-22 08:43:45 -050087
88 void
akmhoque31d1d4b2014-05-05 22:08:14 -050089 setTimedOutInterestCount(const ndn::Name& neighbor, uint32_t count);
akmhoque53353462014-04-22 08:43:45 -050090
Nick G97e34942016-07-11 14:46:27 -050091 /*! \brief Copies the adjacencies in a list to this one.
92
93 \param adl The adjacency list, the entries of which we want to
94 copy into this object.
95
96 Copies the entries contained in one list into this object.
97 */
akmhoque53353462014-04-22 08:43:45 -050098 void
akmhoquefdbddb12014-05-02 18:35:19 -050099 addAdjacents(AdjacencyList& adl);
akmhoque53353462014-04-22 08:43:45 -0500100
Nick G97e34942016-07-11 14:46:27 -0500101 /*! \brief Determines whether this list can be used to build an adj. LSA.
102 \param interestRetryNo The maximum number of hello-interest
103 retries to contact a neighbor.
104
105 \return Returns a boolean indicating whether this list can be used
106 to build an adj. LSA.
107
108 Determines whether this adjacency list object could be used to
109 build an adjacency LSA. An LSA is buildable when the status of all
110 neighbors is known. A neighbor's status is known when their status
111 is ACTIVE, or INACTIVE and some number of hello interests
112 (specified by nlsr::ConfParameter::getInterestRetryNumber()) have
113 failed. To be explicit, a neighbor's status is unknown if we are
114 still sending hello interests.
115 */
akmhoque53353462014-04-22 08:43:45 -0500116 bool
Vince Lehmanf7eec4f2015-05-08 19:02:31 -0500117 isAdjLsaBuildable(const uint32_t interestRetryNo) const;
akmhoque53353462014-04-22 08:43:45 -0500118
akmhoquefdbddb12014-05-02 18:35:19 -0500119 int32_t
akmhoque53353462014-04-22 08:43:45 -0500120 getNumOfActiveNeighbor();
121
122 Adjacent
akmhoque31d1d4b2014-05-05 22:08:14 -0500123 getAdjacent(const ndn::Name& adjName);
akmhoque53353462014-04-22 08:43:45 -0500124
125 bool
akmhoquefdbddb12014-05-02 18:35:19 -0500126 operator==(AdjacencyList& adl);
akmhoque53353462014-04-22 08:43:45 -0500127
akmhoquefdbddb12014-05-02 18:35:19 -0500128 size_t
akmhoque53353462014-04-22 08:43:45 -0500129 getSize()
130 {
131 return m_adjList.size();
132 }
133
134 void
135 reset()
136 {
akmhoque157b0a42014-05-13 00:26:37 -0500137 if (m_adjList.size() > 0) {
akmhoque53353462014-04-22 08:43:45 -0500138 m_adjList.clear();
139 }
140 }
141
akmhoquec04e7272014-07-02 11:00:14 -0500142 Adjacent*
143 findAdjacent(const ndn::Name& adjName);
144
145 Adjacent*
146 findAdjacent(uint64_t faceId);
147
akmhoque102aea42014-08-04 10:22:12 -0500148 uint64_t
149 getFaceId(const std::string& faceUri);
150
akmhoque53353462014-04-22 08:43:45 -0500151 void
akmhoque674b0b12014-05-20 14:33:28 -0500152 writeLog();
153
alvydce3f182015-04-09 11:23:30 -0500154public:
155 const_iterator
156 begin() const
157 {
158 return m_adjList.begin();
159 }
160
161 const_iterator
162 end() const
163 {
164 return m_adjList.end();
165 }
166
akmhoque53353462014-04-22 08:43:45 -0500167private:
alvydce3f182015-04-09 11:23:30 -0500168 iterator
akmhoque31d1d4b2014-05-05 22:08:14 -0500169 find(const ndn::Name& adjName);
akmhoque53353462014-04-22 08:43:45 -0500170
171private:
172 std::list<Adjacent> m_adjList;
173};
174
Nick Gordonfad8e252016-08-11 14:21:38 -0500175} // namespace nlsr
akmhoquefdbddb12014-05-02 18:35:19 -0500176#endif //NLSR_ADJACENCY_LIST_HPP