blob: dd1e658a942fd4f415747e3db9070c7cb28ede2b [file] [log] [blame]
akmhoque3d06e792014-05-27 16:23:20 -05001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Saurab Dulal72b2b252019-01-22 16:58:08 -06003 * Copyright (c) 2014-2019, 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/>.
19 *
akmhoque3d06e792014-05-27 16:23:20 -050020 **/
Nick Gordone40377d2017-08-11 15:10:02 -050021
akmhoquefdbddb12014-05-02 18:35:19 -050022#ifndef NLSR_ROUTING_TABLE_CALCULATOR_HPP
23#define NLSR_ROUTING_TABLE_CALCULATOR_HPP
akmhoque53353462014-04-22 08:43:45 -050024
Nick Gordone40377d2017-08-11 15:10:02 -050025#include "common.hpp"
Ashlesh Gawande85998a12017-12-07 22:22:13 -060026#include "lsa.hpp"
27#include "conf-parameter.hpp"
Nick Gordone40377d2017-08-11 15:10:02 -050028
akmhoque53353462014-04-22 08:43:45 -050029#include <list>
30#include <iostream>
akmhoquefdbddb12014-05-02 18:35:19 -050031#include <boost/cstdint.hpp>
akmhoque53353462014-04-22 08:43:45 -050032
Vince Lehman9a709032014-09-13 16:28:07 -050033#include <ndn-cxx/name.hpp>
34
akmhoque53353462014-04-22 08:43:45 -050035namespace nlsr {
36
37class Map;
38class RoutingTable;
akmhoque53353462014-04-22 08:43:45 -050039
40class RoutingTableCalculator
41{
42public:
43 RoutingTableCalculator()
44 {
45 }
Vince Lehman9a709032014-09-13 16:28:07 -050046 RoutingTableCalculator(size_t nRouters)
akmhoque53353462014-04-22 08:43:45 -050047 {
Vince Lehman9a709032014-09-13 16:28:07 -050048 m_nRouters = nRouters;
akmhoque53353462014-04-22 08:43:45 -050049 }
50protected:
Nick G97e34942016-07-11 14:46:27 -050051 /*! \brief Allocate the space needed for the adj. matrix. */
akmhoque53353462014-04-22 08:43:45 -050052 void
53 allocateAdjMatrix();
54
Nick G97e34942016-07-11 14:46:27 -050055 /*! \brief Zero every cell of the matrix to ensure that the memory is safe. */
akmhoque53353462014-04-22 08:43:45 -050056 void
57 initMatrix();
58
Nick G97e34942016-07-11 14:46:27 -050059 /*! \brief Constructs an adj. matrix to calculate with.
Ashlesh Gawande85998a12017-12-07 22:22:13 -060060 \param adjLsaList The Adjacency Lsa list.
Nick G97e34942016-07-11 14:46:27 -050061 \param pMap The map to populate with the adj. data.
62 */
akmhoque53353462014-04-22 08:43:45 -050063 void
Ashlesh Gawande85998a12017-12-07 22:22:13 -060064 makeAdjMatrix(const std::list<AdjLsa>& adjLsaList, Map& pMap);
Vince Lehman9a709032014-09-13 16:28:07 -050065
akmhoque2f423352014-06-03 11:49:35 -050066 void
Saurab Dulal9da6aa72018-01-12 17:25:51 +000067 writeAdjMatrixLog(const Map& map) const;
akmhoque53353462014-04-22 08:43:45 -050068
Nick G97e34942016-07-11 14:46:27 -050069 /*! \brief Returns how many links a router in the matrix has.
70 \param sRouter The router to count the links of.
71 */
akmhoque53353462014-04-22 08:43:45 -050072 int
73 getNumOfLinkfromAdjMatrix(int sRouter);
74
75 void
76 freeAdjMatrix();
Nick G97e34942016-07-11 14:46:27 -050077 /*! \brief Adjust a link cost in the adj. matrix
78 \param source The source router whose adjacency to adjust.
79 \param link The adjacency of the source to adjust.
80 \param linkCost The cost to change to.
81 */
akmhoque53353462014-04-22 08:43:45 -050082 void
83 adjustAdMatrix(int source, int link, double linkCost);
84
Nick G97e34942016-07-11 14:46:27 -050085 /*! \brief Populates temp. variables with the link costs for some router.
86 \param source The router whose values are to be adjusted.
87 \param links An integer pointer array for the link mappingNos.
88 \param linkCosts A double pointer array that stores the link costs.
89
90 Obtains a sparse list of adjacencies and link costs for some
91 router. Since this is sparse, that means while generating these
92 arrays, if there is no adjacency at i in the matrix, these
93 temporary variables will not contain a 0 at i, but rather will
94 contain the values for the next valid adjacency.
95 */
akmhoque53353462014-04-22 08:43:45 -050096 void
97 getLinksFromAdjMatrix(int* links, double* linkCosts, int source);
98
Nick G97e34942016-07-11 14:46:27 -050099 /*! Allocates an array large enough to hold multipath calculation temps. */
akmhoque53353462014-04-22 08:43:45 -0500100 void
101 allocateLinks();
102
103 void
104 allocateLinkCosts();
105
106 void
107 freeLinks();
108
109 void
110 freeLinksCosts();
111
112 void
113 setNoLink(int nl)
114 {
115 vNoLink = nl;
116 }
117
118protected:
119 double** adjMatrix;
Vince Lehman9a709032014-09-13 16:28:07 -0500120 size_t m_nRouters;
akmhoque53353462014-04-22 08:43:45 -0500121
122 int vNoLink;
123 int* links;
124 double* linkCosts;
125};
126
127class LinkStateRoutingTableCalculator: public RoutingTableCalculator
128{
129public:
Vince Lehman9a709032014-09-13 16:28:07 -0500130 LinkStateRoutingTableCalculator(size_t nRouters)
131 : RoutingTableCalculator(nRouters)
132 , EMPTY_PARENT(-12345)
akmhoque53353462014-04-22 08:43:45 -0500133 , INF_DISTANCE(2147483647)
134 , NO_MAPPING_NUM(-1)
135 , NO_NEXT_HOP(-12345)
136 {
akmhoque53353462014-04-22 08:43:45 -0500137 }
138
akmhoque53353462014-04-22 08:43:45 -0500139 void
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600140 calculatePath(Map& pMap, RoutingTable& rt, ConfParameter& confParam,
141 const std::list<AdjLsa>& adjLsaList);
akmhoque53353462014-04-22 08:43:45 -0500142
akmhoque53353462014-04-22 08:43:45 -0500143private:
Nick G97e34942016-07-11 14:46:27 -0500144 /*! \brief Performs a Dijkstra's calculation over the adjacency matrix.
145 \param sourceRouter The origin router to compute paths from.
146 */
akmhoque53353462014-04-22 08:43:45 -0500147 void
148 doDijkstraPathCalculation(int sourceRouter);
149
Nick G97e34942016-07-11 14:46:27 -0500150 /*! \brief Sort the elements of a list.
151 \param Q The array that contains the elements to sort.
152 \param dist The array that contains the distances.
153 \param start The first element in the list to sort.
154 \param element The last element in the list to sort through.
155
156 Sorts the list based on distance. The distances are indexed by
157 their mappingNo in dist. Currently uses an insertion sort.
158 */
akmhoque53353462014-04-22 08:43:45 -0500159 void
160 sortQueueByDistance(int* Q, double* dist, int start, int element);
161
Nick G97e34942016-07-11 14:46:27 -0500162 /*! \brief Returns whether an element has been visited yet.
163 \param Q The list of elements to look through.
164 \param u The element to check.
165 \param start The start of list to look through.
166 \param element The end of the list to look through.
167 */
akmhoque53353462014-04-22 08:43:45 -0500168 int
169 isNotExplored(int* Q, int u, int start, int element);
170
171 void
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600172 addAllLsNextHopsToRoutingTable(AdjacencyList& adjacencies, RoutingTable& rt,
Vince Lehman9a709032014-09-13 16:28:07 -0500173 Map& pMap, uint32_t sourceRouter);
akmhoque53353462014-04-22 08:43:45 -0500174
Nick G97e34942016-07-11 14:46:27 -0500175 /*! \brief Determines a destination's next hop.
176 \param dest The router whose next hop we want to determine.
177 \param source The router to determine a next path to.
178 */
akmhoque53353462014-04-22 08:43:45 -0500179 int
180 getLsNextHop(int dest, int source);
181
182 void
183 allocateParent();
184
185 void
186 allocateDistance();
187
188 void
189 freeParent();
190
191 void
192 freeDistance();
193
akmhoque53353462014-04-22 08:43:45 -0500194private:
195 int* m_parent;
196 double* m_distance;
197
akmhoque53353462014-04-22 08:43:45 -0500198 const int EMPTY_PARENT;
199 const double INF_DISTANCE;
200 const int NO_MAPPING_NUM;
201 const int NO_NEXT_HOP;
202
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