blob: 35e08eb542835a44478bf8ecf93fd26c0684c29d [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/*
Junxiao Shi4eb4eae2024-02-14 12:36:57 +00003 * Copyright (c) 2014-2024, 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 -050030namespace nlsr {
31
Junxiao Shi4eb4eae2024-02-14 12:36:57 +000032class NameMap;
akmhoque53353462014-04-22 08:43:45 -050033class RoutingTable;
akmhoque53353462014-04-22 08:43:45 -050034
35class RoutingTableCalculator
36{
37public:
Vince Lehman9a709032014-09-13 16:28:07 -050038 RoutingTableCalculator(size_t nRouters)
akmhoque53353462014-04-22 08:43:45 -050039 {
Vince Lehman9a709032014-09-13 16:28:07 -050040 m_nRouters = nRouters;
akmhoque53353462014-04-22 08:43:45 -050041 }
dulalsaurabd0816a32019-07-26 13:11:24 +000042
akmhoque53353462014-04-22 08:43:45 -050043protected:
Nick G97e34942016-07-11 14:46:27 -050044 /*! \brief Allocate the space needed for the adj. matrix. */
akmhoque53353462014-04-22 08:43:45 -050045 void
46 allocateAdjMatrix();
47
dulalsaurabd0816a32019-07-26 13:11:24 +000048 /*! \brief set NON_ADJACENT_COST i.e. -12345 to every cell of the matrix to
49 ensure that the memory is safe. This is also to incorporate zero cost links */
akmhoque53353462014-04-22 08:43:45 -050050 void
51 initMatrix();
52
Nick G97e34942016-07-11 14:46:27 -050053 /*! \brief Constructs an adj. matrix to calculate with.
Ashlesh Gawande57a87172020-05-09 19:47:06 -070054 \param lsdb Reference to the Lsdb
Nick G97e34942016-07-11 14:46:27 -050055 \param pMap The map to populate with the adj. data.
56 */
akmhoque53353462014-04-22 08:43:45 -050057 void
Junxiao Shi4eb4eae2024-02-14 12:36:57 +000058 makeAdjMatrix(const Lsdb& lsdb, NameMap& pMap);
Vince Lehman9a709032014-09-13 16:28:07 -050059
dulalsaurabd0816a32019-07-26 13:11:24 +000060 /*! \brief Writes a formated adjacent matrix to DEBUG log
61 \param map The map containing adjacent matrix data
62 */
akmhoque2f423352014-06-03 11:49:35 -050063 void
Junxiao Shi4eb4eae2024-02-14 12:36:57 +000064 writeAdjMatrixLog(const NameMap& map) const;
akmhoque53353462014-04-22 08:43:45 -050065
Nick G97e34942016-07-11 14:46:27 -050066 /*! \brief Returns how many links a router in the matrix has.
67 \param sRouter The router to count the links of.
68 */
akmhoque53353462014-04-22 08:43:45 -050069 int
70 getNumOfLinkfromAdjMatrix(int sRouter);
71
72 void
73 freeAdjMatrix();
Nick G97e34942016-07-11 14:46:27 -050074 /*! \brief Adjust a link cost in the adj. matrix
75 \param source The source router whose adjacency to adjust.
76 \param link The adjacency of the source to adjust.
77 \param linkCost The cost to change to.
78 */
akmhoque53353462014-04-22 08:43:45 -050079 void
80 adjustAdMatrix(int source, int link, double linkCost);
81
Nick G97e34942016-07-11 14:46:27 -050082 /*! \brief Populates temp. variables with the link costs for some router.
83 \param source The router whose values are to be adjusted.
84 \param links An integer pointer array for the link mappingNos.
85 \param linkCosts A double pointer array that stores the link costs.
86
87 Obtains a sparse list of adjacencies and link costs for some
88 router. Since this is sparse, that means while generating these
89 arrays, if there is no adjacency at i in the matrix, these
dulalsaurabd0816a32019-07-26 13:11:24 +000090 temporary variables will not contain a NON_ADJACENT_COST (-12345) at i,
91 but rather will contain the values for the next valid adjacency.
Nick G97e34942016-07-11 14:46:27 -050092 */
akmhoque53353462014-04-22 08:43:45 -050093 void
94 getLinksFromAdjMatrix(int* links, double* linkCosts, int source);
95
Nick G97e34942016-07-11 14:46:27 -050096 /*! Allocates an array large enough to hold multipath calculation temps. */
akmhoque53353462014-04-22 08:43:45 -050097 void
98 allocateLinks();
99
100 void
101 allocateLinkCosts();
102
103 void
104 freeLinks();
105
106 void
107 freeLinksCosts();
108
109 void
110 setNoLink(int nl)
111 {
112 vNoLink = nl;
113 }
114
115protected:
116 double** adjMatrix;
Vince Lehman9a709032014-09-13 16:28:07 -0500117 size_t m_nRouters;
akmhoque53353462014-04-22 08:43:45 -0500118
119 int vNoLink;
120 int* links;
121 double* linkCosts;
dulalsaurabd0816a32019-07-26 13:11:24 +0000122
akmhoque53353462014-04-22 08:43:45 -0500123};
124
125class LinkStateRoutingTableCalculator: public RoutingTableCalculator
126{
127public:
Vince Lehman9a709032014-09-13 16:28:07 -0500128 LinkStateRoutingTableCalculator(size_t nRouters)
129 : RoutingTableCalculator(nRouters)
akmhoque53353462014-04-22 08:43:45 -0500130 {
akmhoque53353462014-04-22 08:43:45 -0500131 }
132
akmhoque53353462014-04-22 08:43:45 -0500133 void
Junxiao Shi4eb4eae2024-02-14 12:36:57 +0000134 calculatePath(NameMap& pMap, RoutingTable& rt, ConfParameter& confParam,
Ashlesh Gawande57a87172020-05-09 19:47:06 -0700135 const Lsdb& lsdb);
akmhoque53353462014-04-22 08:43:45 -0500136
akmhoque53353462014-04-22 08:43:45 -0500137private:
Nick G97e34942016-07-11 14:46:27 -0500138 /*! \brief Performs a Dijkstra's calculation over the adjacency matrix.
139 \param sourceRouter The origin router to compute paths from.
140 */
akmhoque53353462014-04-22 08:43:45 -0500141 void
142 doDijkstraPathCalculation(int sourceRouter);
143
Nick G97e34942016-07-11 14:46:27 -0500144 /*! \brief Sort the elements of a list.
145 \param Q The array that contains the elements to sort.
146 \param dist The array that contains the distances.
147 \param start The first element in the list to sort.
148 \param element The last element in the list to sort through.
149
150 Sorts the list based on distance. The distances are indexed by
151 their mappingNo in dist. Currently uses an insertion sort.
dulalsaurabd0816a32019-07-26 13:11:24 +0000152
153 The cost between two nodes can be zero or greater than zero.
154
Nick G97e34942016-07-11 14:46:27 -0500155 */
akmhoque53353462014-04-22 08:43:45 -0500156 void
157 sortQueueByDistance(int* Q, double* dist, int start, int element);
158
Nick G97e34942016-07-11 14:46:27 -0500159 /*! \brief Returns whether an element has been visited yet.
160 \param Q The list of elements to look through.
161 \param u The element to check.
162 \param start The start of list to look through.
163 \param element The end of the list to look through.
164 */
akmhoque53353462014-04-22 08:43:45 -0500165 int
166 isNotExplored(int* Q, int u, int start, int element);
167
168 void
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600169 addAllLsNextHopsToRoutingTable(AdjacencyList& adjacencies, RoutingTable& rt,
Junxiao Shi4eb4eae2024-02-14 12:36:57 +0000170 NameMap& pMap, uint32_t sourceRouter);
akmhoque53353462014-04-22 08:43:45 -0500171
Nick G97e34942016-07-11 14:46:27 -0500172 /*! \brief Determines a destination's next hop.
173 \param dest The router whose next hop we want to determine.
174 \param source The router to determine a next path to.
175 */
akmhoque53353462014-04-22 08:43:45 -0500176 int
177 getLsNextHop(int dest, int source);
178
179 void
180 allocateParent();
181
182 void
183 allocateDistance();
184
185 void
186 freeParent();
187
188 void
189 freeDistance();
190
akmhoque53353462014-04-22 08:43:45 -0500191private:
192 int* m_parent;
193 double* m_distance;
akmhoque53353462014-04-22 08:43:45 -0500194};
195
Vince Lehman9a709032014-09-13 16:28:07 -0500196class AdjacencyList;
197class Lsdb;
198
199class HyperbolicRoutingCalculator
akmhoque53353462014-04-22 08:43:45 -0500200{
201public:
Vince Lehman9a709032014-09-13 16:28:07 -0500202 HyperbolicRoutingCalculator(size_t nRouters, bool isDryRun, ndn::Name thisRouterName)
203 : m_nRouters(nRouters)
204 , m_isDryRun(isDryRun)
205 , m_thisRouterName(thisRouterName)
akmhoque53353462014-04-22 08:43:45 -0500206 {
akmhoque53353462014-04-22 08:43:45 -0500207 }
208
209 void
Junxiao Shi4eb4eae2024-02-14 12:36:57 +0000210 calculatePath(NameMap& map, RoutingTable& rt, Lsdb& lsdb, AdjacencyList& adjacencies);
akmhoque53353462014-04-22 08:43:45 -0500211
212private:
akmhoque53353462014-04-22 08:43:45 -0500213 double
Saurab Dulal72b2b252019-01-22 16:58:08 -0600214 getHyperbolicDistance(Lsdb& lsdb, ndn::Name src, ndn::Name dest);
akmhoque53353462014-04-22 08:43:45 -0500215
216 void
Junxiao Shi6593a432023-08-21 10:50:28 +0000217 addNextHop(const ndn::Name& destinationRouter, const ndn::FaceUri& faceUri, double cost, RoutingTable& rt);
akmhoque53353462014-04-22 08:43:45 -0500218
Muktadir R Chowdhuryb00dc2a2016-11-05 10:48:58 -0600219 double
220 calculateHyperbolicDistance(double rI, double rJ, double deltaTheta);
221
222 double
223 calculateAngularDistance(std::vector<double> angleVectorI,
224 std::vector<double> angleVectorJ);
225
akmhoque53353462014-04-22 08:43:45 -0500226private:
Vince Lehman9a709032014-09-13 16:28:07 -0500227 const size_t m_nRouters;
228 const bool m_isDryRun;
229 const ndn::Name m_thisRouterName;
akmhoque53353462014-04-22 08:43:45 -0500230};
231
Nick Gordonfad8e252016-08-11 14:21:38 -0500232} // namespace nlsr
akmhoque53353462014-04-22 08:43:45 -0500233
Muktadir R Chowdhuryb00dc2a2016-11-05 10:48:58 -0600234#endif // NLSR_ROUTING_TABLE_CALCULATOR_HPP