blob: 3b82a7c519789f45d726f01c0f0d2d3abaf71c89 [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/**
Nick Gordon49648702018-01-22 11:57:33 -06003 * Copyright (c) 2014-2018, 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
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
akmhoque53353462014-04-22 08:43:45 -050055 std::list<Adjacent>&
56 getAdjList();
57
Nick Gordon22b5c952017-08-10 17:48:15 -050058 const std::list<Adjacent>&
59 getAdjList() const;
60
akmhoque53353462014-04-22 08:43:45 -050061 bool
Nick Gordon49648702018-01-22 11:57:33 -060062 isNeighbor(const ndn::Name& adjName) const;
akmhoque53353462014-04-22 08:43:45 -050063
64 void
akmhoque31d1d4b2014-05-05 22:08:14 -050065 incrementTimedOutInterestCount(const ndn::Name& neighbor);
akmhoque53353462014-04-22 08:43:45 -050066
akmhoquefdbddb12014-05-02 18:35:19 -050067 int32_t
Nick Gordon49648702018-01-22 11:57:33 -060068 getTimedOutInterestCount(const ndn::Name& neighbor) const;
akmhoque53353462014-04-22 08:43:45 -050069
Vince Lehmancb76ade2014-08-28 21:24:41 -050070 Adjacent::Status
Nick Gordon49648702018-01-22 11:57:33 -060071 getStatusOfNeighbor(const ndn::Name& neighbor) const;
akmhoque53353462014-04-22 08:43:45 -050072
73 void
Vince Lehmancb76ade2014-08-28 21:24:41 -050074 setStatusOfNeighbor(const ndn::Name& neighbor, Adjacent::Status status);
akmhoque53353462014-04-22 08:43:45 -050075
76 void
akmhoque31d1d4b2014-05-05 22:08:14 -050077 setTimedOutInterestCount(const ndn::Name& neighbor, uint32_t count);
akmhoque53353462014-04-22 08:43:45 -050078
Nick G97e34942016-07-11 14:46:27 -050079 /*! \brief Copies the adjacencies in a list to this one.
80
81 \param adl The adjacency list, the entries of which we want to
82 copy into this object.
83
84 Copies the entries contained in one list into this object.
85 */
akmhoque53353462014-04-22 08:43:45 -050086 void
akmhoquefdbddb12014-05-02 18:35:19 -050087 addAdjacents(AdjacencyList& adl);
akmhoque53353462014-04-22 08:43:45 -050088
Nick G97e34942016-07-11 14:46:27 -050089 /*! \brief Determines whether this list can be used to build an adj. LSA.
90 \param interestRetryNo The maximum number of hello-interest
91 retries to contact a neighbor.
92
93 \return Returns a boolean indicating whether this list can be used
94 to build an adj. LSA.
95
96 Determines whether this adjacency list object could be used to
97 build an adjacency LSA. An LSA is buildable when the status of all
98 neighbors is known. A neighbor's status is known when their status
99 is ACTIVE, or INACTIVE and some number of hello interests
100 (specified by nlsr::ConfParameter::getInterestRetryNumber()) have
101 failed. To be explicit, a neighbor's status is unknown if we are
102 still sending hello interests.
103 */
akmhoque53353462014-04-22 08:43:45 -0500104 bool
Vince Lehmanf7eec4f2015-05-08 19:02:31 -0500105 isAdjLsaBuildable(const uint32_t interestRetryNo) const;
akmhoque53353462014-04-22 08:43:45 -0500106
akmhoquefdbddb12014-05-02 18:35:19 -0500107 int32_t
Nick Gordon49648702018-01-22 11:57:33 -0600108 getNumOfActiveNeighbor() const;
akmhoque53353462014-04-22 08:43:45 -0500109
110 Adjacent
akmhoque31d1d4b2014-05-05 22:08:14 -0500111 getAdjacent(const ndn::Name& adjName);
akmhoque53353462014-04-22 08:43:45 -0500112
113 bool
Nick Gordon49648702018-01-22 11:57:33 -0600114 operator==(const AdjacencyList& adl) const;
akmhoque53353462014-04-22 08:43:45 -0500115
akmhoquefdbddb12014-05-02 18:35:19 -0500116 size_t
Nick Gordonff9a6272017-10-12 13:38:29 -0500117 size() const
akmhoque53353462014-04-22 08:43:45 -0500118 {
119 return m_adjList.size();
120 }
121
122 void
123 reset()
124 {
akmhoque157b0a42014-05-13 00:26:37 -0500125 if (m_adjList.size() > 0) {
akmhoque53353462014-04-22 08:43:45 -0500126 m_adjList.clear();
127 }
128 }
129
Nick Gordonc780a692017-04-27 18:03:02 -0500130 AdjacencyList::iterator
akmhoquec04e7272014-07-02 11:00:14 -0500131 findAdjacent(const ndn::Name& adjName);
132
Nick Gordonc780a692017-04-27 18:03:02 -0500133 AdjacencyList::iterator
akmhoquec04e7272014-07-02 11:00:14 -0500134 findAdjacent(uint64_t faceId);
135
Nick Gordone9733ed2017-04-26 10:48:39 -0500136 AdjacencyList::iterator
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500137 findAdjacent(const ndn::FaceUri& faceUri);
Nick Gordone9733ed2017-04-26 10:48:39 -0500138
Ashlesh Gawande793e8702017-08-01 15:59:26 -0500139 /*! \brief Hack to stop developers from using this function
140
141 It is here so that faceUri cannot be passed in as string,
142 converted to Name and findAdjacent(Name) be used.
143 So when faceUri is passed as string this will cause a compile error
144 */
145 template <typename T = float> void
146 findAdjacent(const std::string& faceUri)
147 {
148 BOOST_STATIC_ASSERT_MSG(std::is_integral<T>::value,
149 "Don't use std::string with findAdjacent!");
150 }
151
akmhoque102aea42014-08-04 10:22:12 -0500152 uint64_t
Muktadir Chowdhuryf04f9892017-08-20 20:42:56 -0500153 getFaceId(const ndn::FaceUri& faceUri);
akmhoque102aea42014-08-04 10:22:12 -0500154
akmhoque53353462014-04-22 08:43:45 -0500155 void
akmhoque674b0b12014-05-20 14:33:28 -0500156 writeLog();
157
alvydce3f182015-04-09 11:23:30 -0500158public:
159 const_iterator
160 begin() const
161 {
162 return m_adjList.begin();
163 }
164
165 const_iterator
166 end() const
167 {
168 return m_adjList.end();
169 }
170
akmhoque53353462014-04-22 08:43:45 -0500171private:
alvydce3f182015-04-09 11:23:30 -0500172 iterator
akmhoque31d1d4b2014-05-05 22:08:14 -0500173 find(const ndn::Name& adjName);
akmhoque53353462014-04-22 08:43:45 -0500174
Nick Gordon49648702018-01-22 11:57:33 -0600175 const_iterator
176 find(const ndn::Name& adjName) const;
177
akmhoque53353462014-04-22 08:43:45 -0500178private:
179 std::list<Adjacent> m_adjList;
180};
181
Nick Gordonfad8e252016-08-11 14:21:38 -0500182} // namespace nlsr
Nick Gordonc780a692017-04-27 18:03:02 -0500183#endif // NLSR_ADJACENCY_LIST_HPP