blob: 77bc8b1af74ffeb41b39be964e805f942390086c [file] [log] [blame]
akmhoque3d06e792014-05-27 16:23:20 -05001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Ashlesh Gawande0421bc62020-05-08 20:42:19 -07002/*
Davide Pesaventoc1d0e8e2022-06-15 14:26:02 -04003 * Copyright (c) 2014-2022, 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 Gawande0421bc62020-05-08 20:42:19 -070019 */
Ashlesh Gawande0db4d4d2020-02-05 20:30:02 -080020
21#ifndef NLSR_ROUTE_NEXTHOP_HPP
22#define NLSR_ROUTE_NEXTHOP_HPP
akmhoque53353462014-04-22 08:43:45 -050023
Vince Lehman20fe4a92014-09-09 15:57:59 -050024#include "test-access-control.hpp"
25
Ashlesh Gawande0421bc62020-05-08 20:42:19 -070026#include <ndn-cxx/encoding/block.hpp>
27#include <ndn-cxx/encoding/encoding-buffer.hpp>
28#include <ndn-cxx/encoding/tlv.hpp>
29
akmhoque102aea42014-08-04 10:22:12 -050030#include <cmath>
Davide Pesaventod90338d2021-01-07 17:50:05 -050031#include <ostream>
akmhoque53353462014-04-22 08:43:45 -050032
33namespace nlsr {
Ashlesh Gawande0db4d4d2020-02-05 20:30:02 -080034
Ashlesh Gawande0421bc62020-05-08 20:42:19 -070035/*! \brief Data abstraction for Nexthop
36 *
37 * NextHop := NEXTHOP-TYPE TLV-LENGTH
38 * Uri
39 * Cost
40 *
41 * \sa https://redmine.named-data.net/projects/nlsr/wiki/Routing_Table_Dataset
42 */
akmhoque53353462014-04-22 08:43:45 -050043class NextHop
44{
45public:
Ashlesh Gawande0421bc62020-05-08 20:42:19 -070046 using Error = ndn::tlv::Error;
47
akmhoque53353462014-04-22 08:43:45 -050048 NextHop()
akmhoque157b0a42014-05-13 00:26:37 -050049 : m_connectingFaceUri()
akmhoque53353462014-04-22 08:43:45 -050050 , m_routeCost(0)
Vince Lehman20fe4a92014-09-09 15:57:59 -050051 , m_isHyperbolic(false)
akmhoque53353462014-04-22 08:43:45 -050052 {
53 }
54
akmhoque157b0a42014-05-13 00:26:37 -050055 NextHop(const std::string& cfu, double rc)
Ashlesh Gawande0421bc62020-05-08 20:42:19 -070056 : m_connectingFaceUri(cfu)
57 , m_routeCost(rc)
58 , m_isHyperbolic(false)
akmhoque53353462014-04-22 08:43:45 -050059 {
Ashlesh Gawande0421bc62020-05-08 20:42:19 -070060 }
61
62 NextHop(const ndn::Block& block)
63 {
64 wireDecode(block);
akmhoque53353462014-04-22 08:43:45 -050065 }
66
akmhoque157b0a42014-05-13 00:26:37 -050067 const std::string&
68 getConnectingFaceUri() const
akmhoque53353462014-04-22 08:43:45 -050069 {
akmhoque157b0a42014-05-13 00:26:37 -050070 return m_connectingFaceUri;
akmhoque53353462014-04-22 08:43:45 -050071 }
72
73 void
akmhoque157b0a42014-05-13 00:26:37 -050074 setConnectingFaceUri(const std::string& cfu)
akmhoque53353462014-04-22 08:43:45 -050075 {
akmhoque157b0a42014-05-13 00:26:37 -050076 m_connectingFaceUri = cfu;
akmhoque53353462014-04-22 08:43:45 -050077 }
78
akmhoque102aea42014-08-04 10:22:12 -050079 uint64_t
Vince Lehman145064a2014-08-23 11:44:16 -050080 getRouteCostAsAdjustedInteger() const
81 {
Vince Lehman20fe4a92014-09-09 15:57:59 -050082 if (m_isHyperbolic) {
83 // Round the cost to better preserve decimal cost differences
84 // e.g. Without rounding: 12.3456 > 12.3454 -> 12345 = 12345
85 // With rounding: 12.3456 > 12.3454 -> 12346 > 12345
86 return static_cast<uint64_t>(round(m_routeCost*HYPERBOLIC_COST_ADJUSTMENT_FACTOR));
87 }
88 else {
89 return static_cast<uint64_t>(m_routeCost);
90 }
Vince Lehman145064a2014-08-23 11:44:16 -050091 }
92
93 double
akmhoque53353462014-04-22 08:43:45 -050094 getRouteCost() const
95 {
Vince Lehman145064a2014-08-23 11:44:16 -050096 return m_routeCost;
akmhoque53353462014-04-22 08:43:45 -050097 }
98
99 void
Vince Lehmanef21d8e2015-04-01 15:59:39 -0500100 setRouteCost(const double rc)
akmhoque53353462014-04-22 08:43:45 -0500101 {
102 m_routeCost = rc;
103 }
104
Vince Lehman20fe4a92014-09-09 15:57:59 -0500105 void
106 setHyperbolic(bool b)
107 {
108 m_isHyperbolic = b;
109 }
110
111 bool
112 isHyperbolic() const
113 {
114 return m_isHyperbolic;
115 }
116
Ashlesh Gawande0421bc62020-05-08 20:42:19 -0700117 template<ndn::encoding::Tag TAG>
118 size_t
119 wireEncode(ndn::EncodingImpl<TAG>& block) const;
120
121 const ndn::Block&
122 wireEncode() const;
123
124 void
125 wireDecode(const ndn::Block& wire);
126
akmhoque53353462014-04-22 08:43:45 -0500127private:
akmhoque157b0a42014-05-13 00:26:37 -0500128 std::string m_connectingFaceUri;
akmhoque53353462014-04-22 08:43:45 -0500129 double m_routeCost;
Vince Lehman20fe4a92014-09-09 15:57:59 -0500130 bool m_isHyperbolic;
131
Ashlesh Gawande0421bc62020-05-08 20:42:19 -0700132 mutable ndn::Block m_wire;
133
Vince Lehman20fe4a92014-09-09 15:57:59 -0500134PUBLIC_WITH_TESTS_ELSE_PRIVATE:
Nick G97e34942016-07-11 14:46:27 -0500135 /*! \brief Used to adjust floating point route costs to integers
136 Since NFD uses integer route costs in the FIB, hyperbolic paths with similar route costs
137 will be rounded to integers and installed with identical nexthop costs.
138
139 e.g. costs 12.34 and 12.35 will be equal in NFD's FIB
140
141 This multiplier is used to differentiate similar route costs in the FIB.
142
143 e.g costs 12.34 and 12.35 will be installed into NFD's FIB as 12340 and 12350
Vince Lehman20fe4a92014-09-09 15:57:59 -0500144 */
Davide Pesaventoc1d0e8e2022-06-15 14:26:02 -0400145 static constexpr uint64_t HYPERBOLIC_COST_ADJUSTMENT_FACTOR = 1000;
akmhoque53353462014-04-22 08:43:45 -0500146};
147
Ashlesh Gawande0421bc62020-05-08 20:42:19 -0700148NDN_CXX_DECLARE_WIRE_ENCODE_INSTANTIATIONS(NextHop);
149
Nick Gordonb50e51b2016-07-22 16:05:57 -0500150bool
151operator==(const NextHop& lhs, const NextHop& rhs);
152
Vince Lehman9a709032014-09-13 16:28:07 -0500153std::ostream&
154operator<<(std::ostream& os, const NextHop& hop);
155
Nick Gordonfad8e252016-08-11 14:21:38 -0500156} // namespace nlsr
akmhoque53353462014-04-22 08:43:45 -0500157
Ashlesh Gawande0db4d4d2020-02-05 20:30:02 -0800158#endif // NLSR_ROUTE_NEXTHOP_HPP