blob: b497c06fda37b4661721f7970f792483d160180d [file] [log] [blame]
akmhoque3d06e792014-05-27 16:23:20 -05001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Ashlesh Gawande57a87172020-05-09 19:47:06 -07002/*
Davide Pesaventod90338d2021-01-07 17:50:05 -05003 * Copyright (c) 2014-2021, The University of Memphis,
Nick Gordonf8b5bcd2016-08-11 15:06:50 -05004 * Regents of the University of California
akmhoque3d06e792014-05-27 16:23:20 -05005 *
6 * This file is part of NLSR (Named-data Link State Routing).
7 * See AUTHORS.md for complete list of NLSR authors and contributors.
8 *
9 * NLSR is free software: you can redistribute it and/or modify it under the terms
10 * of the GNU General Public License as published by the Free Software Foundation,
11 * either version 3 of the License, or (at your option) any later version.
12 *
13 * NLSR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
14 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License along with
18 * NLSR, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
Ashlesh Gawande57a87172020-05-09 19:47:06 -070019 */
Nick Gordone40377d2017-08-11 15:10:02 -050020
akmhoquefdbddb12014-05-02 18:35:19 -050021#ifndef NLSR_ROUTING_TABLE_CALCULATOR_HPP
22#define NLSR_ROUTING_TABLE_CALCULATOR_HPP
akmhoque53353462014-04-22 08:43:45 -050023
Nick Gordone40377d2017-08-11 15:10:02 -050024#include "common.hpp"
Ashlesh Gawande0db4d4d2020-02-05 20:30:02 -080025#include "lsa/lsa.hpp"
26#include "lsa/adj-lsa.hpp"
Ashlesh Gawande57a87172020-05-09 19:47:06 -070027#include "lsdb.hpp"
Ashlesh Gawande85998a12017-12-07 22:22:13 -060028#include "conf-parameter.hpp"
Nick Gordone40377d2017-08-11 15:10:02 -050029
akmhoque53353462014-04-22 08:43:45 -050030#include <list>
Vince Lehman9a709032014-09-13 16:28:07 -050031
akmhoque53353462014-04-22 08:43:45 -050032namespace nlsr {
33
34class Map;
35class RoutingTable;
akmhoque53353462014-04-22 08:43:45 -050036
37class RoutingTableCalculator
38{
39public:
Vince Lehman9a709032014-09-13 16:28:07 -050040 RoutingTableCalculator(size_t nRouters)
akmhoque53353462014-04-22 08:43:45 -050041 {
Vince Lehman9a709032014-09-13 16:28:07 -050042 m_nRouters = nRouters;
akmhoque53353462014-04-22 08:43:45 -050043 }
dulalsaurabd0816a32019-07-26 13:11:24 +000044
akmhoque53353462014-04-22 08:43:45 -050045protected:
Nick G97e34942016-07-11 14:46:27 -050046 /*! \brief Allocate the space needed for the adj. matrix. */
akmhoque53353462014-04-22 08:43:45 -050047 void
48 allocateAdjMatrix();
49
dulalsaurabd0816a32019-07-26 13:11:24 +000050 /*! \brief set NON_ADJACENT_COST i.e. -12345 to every cell of the matrix to
51 ensure that the memory is safe. This is also to incorporate zero cost links */
akmhoque53353462014-04-22 08:43:45 -050052 void
53 initMatrix();
54
Nick G97e34942016-07-11 14:46:27 -050055 /*! \brief Constructs an adj. matrix to calculate with.
Ashlesh Gawande57a87172020-05-09 19:47:06 -070056 \param lsdb Reference to the Lsdb
Nick G97e34942016-07-11 14:46:27 -050057 \param pMap The map to populate with the adj. data.
58 */
akmhoque53353462014-04-22 08:43:45 -050059 void
Ashlesh Gawande57a87172020-05-09 19:47:06 -070060 makeAdjMatrix(const Lsdb& lsdb, Map& pMap);
Vince Lehman9a709032014-09-13 16:28:07 -050061
dulalsaurabd0816a32019-07-26 13:11:24 +000062 /*! \brief Writes a formated adjacent matrix to DEBUG log
63 \param map The map containing adjacent matrix data
64 */
akmhoque2f423352014-06-03 11:49:35 -050065 void
Saurab Dulal9da6aa72018-01-12 17:25:51 +000066 writeAdjMatrixLog(const Map& map) const;
akmhoque53353462014-04-22 08:43:45 -050067
Nick G97e34942016-07-11 14:46:27 -050068 /*! \brief Returns how many links a router in the matrix has.
69 \param sRouter The router to count the links of.
70 */
akmhoque53353462014-04-22 08:43:45 -050071 int
72 getNumOfLinkfromAdjMatrix(int sRouter);
73
74 void
75 freeAdjMatrix();
Nick G97e34942016-07-11 14:46:27 -050076 /*! \brief Adjust a link cost in the adj. matrix
77 \param source The source router whose adjacency to adjust.
78 \param link The adjacency of the source to adjust.
79 \param linkCost The cost to change to.
80 */
akmhoque53353462014-04-22 08:43:45 -050081 void
82 adjustAdMatrix(int source, int link, double linkCost);
83
Nick G97e34942016-07-11 14:46:27 -050084 /*! \brief Populates temp. variables with the link costs for some router.
85 \param source The router whose values are to be adjusted.
86 \param links An integer pointer array for the link mappingNos.
87 \param linkCosts A double pointer array that stores the link costs.
88
89 Obtains a sparse list of adjacencies and link costs for some
90 router. Since this is sparse, that means while generating these
91 arrays, if there is no adjacency at i in the matrix, these
dulalsaurabd0816a32019-07-26 13:11:24 +000092 temporary variables will not contain a NON_ADJACENT_COST (-12345) at i,
93 but rather will contain the values for the next valid adjacency.
Nick G97e34942016-07-11 14:46:27 -050094 */
akmhoque53353462014-04-22 08:43:45 -050095 void
96 getLinksFromAdjMatrix(int* links, double* linkCosts, int source);
97
Nick G97e34942016-07-11 14:46:27 -050098 /*! Allocates an array large enough to hold multipath calculation temps. */
akmhoque53353462014-04-22 08:43:45 -050099 void
100 allocateLinks();
101
102 void
103 allocateLinkCosts();
104
105 void
106 freeLinks();
107
108 void
109 freeLinksCosts();
110
111 void
112 setNoLink(int nl)
113 {
114 vNoLink = nl;
115 }
116
117protected:
118 double** adjMatrix;
Vince Lehman9a709032014-09-13 16:28:07 -0500119 size_t m_nRouters;
akmhoque53353462014-04-22 08:43:45 -0500120
121 int vNoLink;
122 int* links;
123 double* linkCosts;
dulalsaurabd0816a32019-07-26 13:11:24 +0000124
akmhoque53353462014-04-22 08:43:45 -0500125};
126
127class LinkStateRoutingTableCalculator: public RoutingTableCalculator
128{
129public:
Vince Lehman9a709032014-09-13 16:28:07 -0500130 LinkStateRoutingTableCalculator(size_t nRouters)
131 : RoutingTableCalculator(nRouters)
akmhoque53353462014-04-22 08:43:45 -0500132 {
akmhoque53353462014-04-22 08:43:45 -0500133 }
134
akmhoque53353462014-04-22 08:43:45 -0500135 void
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600136 calculatePath(Map& pMap, RoutingTable& rt, ConfParameter& confParam,
Ashlesh Gawande57a87172020-05-09 19:47:06 -0700137 const Lsdb& lsdb);
akmhoque53353462014-04-22 08:43:45 -0500138
akmhoque53353462014-04-22 08:43:45 -0500139private:
Nick G97e34942016-07-11 14:46:27 -0500140 /*! \brief Performs a Dijkstra's calculation over the adjacency matrix.
141 \param sourceRouter The origin router to compute paths from.
142 */
akmhoque53353462014-04-22 08:43:45 -0500143 void
144 doDijkstraPathCalculation(int sourceRouter);
145
Nick G97e34942016-07-11 14:46:27 -0500146 /*! \brief Sort the elements of a list.
147 \param Q The array that contains the elements to sort.
148 \param dist The array that contains the distances.
149 \param start The first element in the list to sort.
150 \param element The last element in the list to sort through.
151
152 Sorts the list based on distance. The distances are indexed by
153 their mappingNo in dist. Currently uses an insertion sort.
dulalsaurabd0816a32019-07-26 13:11:24 +0000154
155 The cost between two nodes can be zero or greater than zero.
156
Nick G97e34942016-07-11 14:46:27 -0500157 */
akmhoque53353462014-04-22 08:43:45 -0500158 void
159 sortQueueByDistance(int* Q, double* dist, int start, int element);
160
Nick G97e34942016-07-11 14:46:27 -0500161 /*! \brief Returns whether an element has been visited yet.
162 \param Q The list of elements to look through.
163 \param u The element to check.
164 \param start The start of list to look through.
165 \param element The end of the list to look through.
166 */
akmhoque53353462014-04-22 08:43:45 -0500167 int
168 isNotExplored(int* Q, int u, int start, int element);
169
170 void
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600171 addAllLsNextHopsToRoutingTable(AdjacencyList& adjacencies, RoutingTable& rt,
Vince Lehman9a709032014-09-13 16:28:07 -0500172 Map& pMap, uint32_t sourceRouter);
akmhoque53353462014-04-22 08:43:45 -0500173
Nick G97e34942016-07-11 14:46:27 -0500174 /*! \brief Determines a destination's next hop.
175 \param dest The router whose next hop we want to determine.
176 \param source The router to determine a next path to.
177 */
akmhoque53353462014-04-22 08:43:45 -0500178 int
179 getLsNextHop(int dest, int source);
180
181 void
182 allocateParent();
183
184 void
185 allocateDistance();
186
187 void
188 freeParent();
189
190 void
191 freeDistance();
192
akmhoque53353462014-04-22 08:43:45 -0500193private:
194 int* m_parent;
195 double* m_distance;
196
dulalsaurabd0816a32019-07-26 13:11:24 +0000197 static const int EMPTY_PARENT;
198 static const double INF_DISTANCE;
199 static const int NO_MAPPING_NUM;
Ashlesh Gawande6b388fc2019-09-30 10:14:41 -0500200public:
dulalsaurabd0816a32019-07-26 13:11:24 +0000201 static const int NO_NEXT_HOP;
akmhoque53353462014-04-22 08:43:45 -0500202
203};
204
Vince Lehman9a709032014-09-13 16:28:07 -0500205class AdjacencyList;
206class Lsdb;
207
208class HyperbolicRoutingCalculator
akmhoque53353462014-04-22 08:43:45 -0500209{
210public:
Vince Lehman9a709032014-09-13 16:28:07 -0500211 HyperbolicRoutingCalculator(size_t nRouters, bool isDryRun, ndn::Name thisRouterName)
212 : m_nRouters(nRouters)
213 , m_isDryRun(isDryRun)
214 , m_thisRouterName(thisRouterName)
akmhoque53353462014-04-22 08:43:45 -0500215 {
akmhoque53353462014-04-22 08:43:45 -0500216 }
217
218 void
Saurab Dulal72b2b252019-01-22 16:58:08 -0600219 calculatePath(Map& map, RoutingTable& rt, Lsdb& lsdb, AdjacencyList& adjacencies);
akmhoque53353462014-04-22 08:43:45 -0500220
221private:
akmhoque53353462014-04-22 08:43:45 -0500222 double
Saurab Dulal72b2b252019-01-22 16:58:08 -0600223 getHyperbolicDistance(Lsdb& lsdb, ndn::Name src, ndn::Name dest);
akmhoque53353462014-04-22 08:43:45 -0500224
225 void
Vince Lehman9a709032014-09-13 16:28:07 -0500226 addNextHop(ndn::Name destinationRouter, std::string faceUri, double cost, RoutingTable& rt);
akmhoque53353462014-04-22 08:43:45 -0500227
Muktadir R Chowdhuryb00dc2a2016-11-05 10:48:58 -0600228 double
229 calculateHyperbolicDistance(double rI, double rJ, double deltaTheta);
230
231 double
232 calculateAngularDistance(std::vector<double> angleVectorI,
233 std::vector<double> angleVectorJ);
234
akmhoque53353462014-04-22 08:43:45 -0500235private:
Vince Lehman9a709032014-09-13 16:28:07 -0500236 const size_t m_nRouters;
237 const bool m_isDryRun;
238 const ndn::Name m_thisRouterName;
akmhoque53353462014-04-22 08:43:45 -0500239
Vince Lehman9a709032014-09-13 16:28:07 -0500240 static const double MATH_PI;
241 static const double UNKNOWN_DISTANCE;
242 static const double UNKNOWN_RADIUS;
akmhoque53353462014-04-22 08:43:45 -0500243};
244
Nick Gordonfad8e252016-08-11 14:21:38 -0500245} // namespace nlsr
akmhoque53353462014-04-22 08:43:45 -0500246
Muktadir R Chowdhuryb00dc2a2016-11-05 10:48:58 -0600247#endif // NLSR_ROUTING_TABLE_CALCULATOR_HPP