blob: 35e08eb542835a44478bf8ecf93fd26c0684c29d [file] [log] [blame]
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
* Copyright (c) 2014-2024, The University of Memphis,
* Regents of the University of California
*
* This file is part of NLSR (Named-data Link State Routing).
* See AUTHORS.md for complete list of NLSR authors and contributors.
*
* NLSR is free software: you can redistribute it and/or modify it under the terms
* of the GNU General Public License as published by the Free Software Foundation,
* either version 3 of the License, or (at your option) any later version.
*
* NLSR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with
* NLSR, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef NLSR_ROUTING_TABLE_CALCULATOR_HPP
#define NLSR_ROUTING_TABLE_CALCULATOR_HPP
#include "common.hpp"
#include "lsa/lsa.hpp"
#include "lsa/adj-lsa.hpp"
#include "lsdb.hpp"
#include "conf-parameter.hpp"
namespace nlsr {
class NameMap;
class RoutingTable;
class RoutingTableCalculator
{
public:
RoutingTableCalculator(size_t nRouters)
{
m_nRouters = nRouters;
}
protected:
/*! \brief Allocate the space needed for the adj. matrix. */
void
allocateAdjMatrix();
/*! \brief set NON_ADJACENT_COST i.e. -12345 to every cell of the matrix to
ensure that the memory is safe. This is also to incorporate zero cost links */
void
initMatrix();
/*! \brief Constructs an adj. matrix to calculate with.
\param lsdb Reference to the Lsdb
\param pMap The map to populate with the adj. data.
*/
void
makeAdjMatrix(const Lsdb& lsdb, NameMap& pMap);
/*! \brief Writes a formated adjacent matrix to DEBUG log
\param map The map containing adjacent matrix data
*/
void
writeAdjMatrixLog(const NameMap& map) const;
/*! \brief Returns how many links a router in the matrix has.
\param sRouter The router to count the links of.
*/
int
getNumOfLinkfromAdjMatrix(int sRouter);
void
freeAdjMatrix();
/*! \brief Adjust a link cost in the adj. matrix
\param source The source router whose adjacency to adjust.
\param link The adjacency of the source to adjust.
\param linkCost The cost to change to.
*/
void
adjustAdMatrix(int source, int link, double linkCost);
/*! \brief Populates temp. variables with the link costs for some router.
\param source The router whose values are to be adjusted.
\param links An integer pointer array for the link mappingNos.
\param linkCosts A double pointer array that stores the link costs.
Obtains a sparse list of adjacencies and link costs for some
router. Since this is sparse, that means while generating these
arrays, if there is no adjacency at i in the matrix, these
temporary variables will not contain a NON_ADJACENT_COST (-12345) at i,
but rather will contain the values for the next valid adjacency.
*/
void
getLinksFromAdjMatrix(int* links, double* linkCosts, int source);
/*! Allocates an array large enough to hold multipath calculation temps. */
void
allocateLinks();
void
allocateLinkCosts();
void
freeLinks();
void
freeLinksCosts();
void
setNoLink(int nl)
{
vNoLink = nl;
}
protected:
double** adjMatrix;
size_t m_nRouters;
int vNoLink;
int* links;
double* linkCosts;
};
class LinkStateRoutingTableCalculator: public RoutingTableCalculator
{
public:
LinkStateRoutingTableCalculator(size_t nRouters)
: RoutingTableCalculator(nRouters)
{
}
void
calculatePath(NameMap& pMap, RoutingTable& rt, ConfParameter& confParam,
const Lsdb& lsdb);
private:
/*! \brief Performs a Dijkstra's calculation over the adjacency matrix.
\param sourceRouter The origin router to compute paths from.
*/
void
doDijkstraPathCalculation(int sourceRouter);
/*! \brief Sort the elements of a list.
\param Q The array that contains the elements to sort.
\param dist The array that contains the distances.
\param start The first element in the list to sort.
\param element The last element in the list to sort through.
Sorts the list based on distance. The distances are indexed by
their mappingNo in dist. Currently uses an insertion sort.
The cost between two nodes can be zero or greater than zero.
*/
void
sortQueueByDistance(int* Q, double* dist, int start, int element);
/*! \brief Returns whether an element has been visited yet.
\param Q The list of elements to look through.
\param u The element to check.
\param start The start of list to look through.
\param element The end of the list to look through.
*/
int
isNotExplored(int* Q, int u, int start, int element);
void
addAllLsNextHopsToRoutingTable(AdjacencyList& adjacencies, RoutingTable& rt,
NameMap& pMap, uint32_t sourceRouter);
/*! \brief Determines a destination's next hop.
\param dest The router whose next hop we want to determine.
\param source The router to determine a next path to.
*/
int
getLsNextHop(int dest, int source);
void
allocateParent();
void
allocateDistance();
void
freeParent();
void
freeDistance();
private:
int* m_parent;
double* m_distance;
};
class AdjacencyList;
class Lsdb;
class HyperbolicRoutingCalculator
{
public:
HyperbolicRoutingCalculator(size_t nRouters, bool isDryRun, ndn::Name thisRouterName)
: m_nRouters(nRouters)
, m_isDryRun(isDryRun)
, m_thisRouterName(thisRouterName)
{
}
void
calculatePath(NameMap& map, RoutingTable& rt, Lsdb& lsdb, AdjacencyList& adjacencies);
private:
double
getHyperbolicDistance(Lsdb& lsdb, ndn::Name src, ndn::Name dest);
void
addNextHop(const ndn::Name& destinationRouter, const ndn::FaceUri& faceUri, double cost, RoutingTable& rt);
double
calculateHyperbolicDistance(double rI, double rJ, double deltaTheta);
double
calculateAngularDistance(std::vector<double> angleVectorI,
std::vector<double> angleVectorJ);
private:
const size_t m_nRouters;
const bool m_isDryRun;
const ndn::Name m_thisRouterName;
};
} // namespace nlsr
#endif // NLSR_ROUTING_TABLE_CALCULATOR_HPP