blob: 8fca57418844afdb287ca5450f8153015bf725a6 [file] [log] [blame]
akmhoque3d06e792014-05-27 16:23:20 -05001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Ashlesh Gawande5d93aa52020-06-13 18:57:45 -07002/*
awlane6d7c37f2025-03-07 11:53:58 -06003 * Copyright (c) 2014-2025, The University of Memphis,
Vince Lehmancae33b62015-06-05 09:21:30 -05004 * Regents of the University of California,
5 * Arizona Board of Regents.
akmhoque3d06e792014-05-27 16:23:20 -05006 *
7 * This file is part of NLSR (Named-data Link State Routing).
8 * See AUTHORS.md for complete list of NLSR authors and contributors.
9 *
10 * NLSR is free software: you can redistribute it and/or modify it under the terms
11 * of the GNU General Public License as published by the Free Software Foundation,
12 * either version 3 of the License, or (at your option) any later version.
13 *
14 * NLSR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
15 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
16 * PURPOSE. See the GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License along with
19 * NLSR, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
Ashlesh Gawande5d93aa52020-06-13 18:57:45 -070020 */
Vince Lehmancae33b62015-06-05 09:21:30 -050021
akmhoquefdbddb12014-05-02 18:35:19 -050022#ifndef NLSR_NAME_PREFIX_TABLE_HPP
23#define NLSR_NAME_PREFIX_TABLE_HPP
akmhoque53353462014-04-22 08:43:45 -050024
akmhoquec8a10f72014-04-25 18:42:55 -050025#include "name-prefix-table-entry.hpp"
Nick Gordonb50e51b2016-07-22 16:05:57 -050026#include "routing-table-pool-entry.hpp"
Nick Gordonb7b58392017-08-17 16:29:21 -050027#include "signals.hpp"
Nick Gordonb50e51b2016-07-22 16:05:57 -050028#include "test-access-control.hpp"
Ashlesh Gawande85998a12017-12-07 22:22:13 -060029#include "route/fib.hpp"
Ashlesh Gawande5d93aa52020-06-13 18:57:45 -070030#include "lsdb.hpp"
akmhoque53353462014-04-22 08:43:45 -050031
Vince Lehmancae33b62015-06-05 09:21:30 -050032#include <list>
Nick Gordonb50e51b2016-07-22 16:05:57 -050033#include <unordered_map>
Vince Lehmancae33b62015-06-05 09:21:30 -050034
akmhoque53353462014-04-22 08:43:45 -050035namespace nlsr {
akmhoque53353462014-04-22 08:43:45 -050036
akmhoquec8a10f72014-04-25 18:42:55 -050037class NamePrefixTable
akmhoque53353462014-04-22 08:43:45 -050038{
39public:
Nick Gordonc0c6bcf2017-08-15 18:11:21 -050040 using RoutingTableEntryPool =
41 std::unordered_map<ndn::Name, std::shared_ptr<RoutingTablePoolEntry>>;
42 using NptEntryList = std::list<std::shared_ptr<NamePrefixTableEntry>>;
43 using const_iterator = NptEntryList::const_iterator;
awlane6d7c37f2025-03-07 11:53:58 -060044 using DestNameKey = std::tuple<ndn::Name, ndn::Name>;
Nick Gordonb50e51b2016-07-22 16:05:57 -050045
Ashlesh Gawande5d93aa52020-06-13 18:57:45 -070046 NamePrefixTable(const ndn::Name& ownRouterName, Fib& fib, RoutingTable& routingTable,
47 AfterRoutingChange& afterRoutingChangeSignal,
48 Lsdb::AfterLsdbModified& afterLsdbModifiedSignal);
Nick Gordonb7b58392017-08-17 16:29:21 -050049
50 ~NamePrefixTable();
akmhoque53353462014-04-22 08:43:45 -050051
awlane6d7c37f2025-03-07 11:53:58 -060052 NexthopList
53 adjustNexthopCosts(const NexthopList& nhlist, const ndn::Name& nameToCheck, const ndn::Name& destRouterName);
54
Ashlesh Gawande5d93aa52020-06-13 18:57:45 -070055 /*! \brief Add, update, or remove Names according to the Lsdb update
56 \param lsa The LSA class pointer
57 \param updateType Update type from Lsdb (INSTALLED, UPDATED, REMOVED)
58 \param namesToAdd If LSA is UPDATED, then these are the names to add
59 \param namesToRemove If LSA is UPDATED, then these are the names to remove
60 */
61 void
62 updateFromLsdb(std::shared_ptr<Lsa> lsa, LsdbUpdate updateType,
awlane6d7c37f2025-03-07 11:53:58 -060063 const std::list<nlsr::PrefixInfo>& namesToAdd,
64 const std::list<nlsr::PrefixInfo>& namesToRemove);
Ashlesh Gawande5d93aa52020-06-13 18:57:45 -070065
Nick Gordonb50e51b2016-07-22 16:05:57 -050066 /*! \brief Adds a destination to the specified name prefix.
67 \param name The name prefix
68 \param destRouter The destination router prefix
Nick G97e34942016-07-11 14:46:27 -050069
Nick Gordonb50e51b2016-07-22 16:05:57 -050070 This method adds a router to a name prefix table entry. If the
71 name prefix table entry does not exist, it is created. The method
72 will first look through its local pool of cached entries to find
73 the routing information for destRouter. If it is not found there,
74 it will construct one and fill it with information from an
75 appropriate RoutingTableEntry in the routing table. If there isn't
76 a match, it will instantiate it with no next hops. The FIB will be
77 notified of the change to the NPT entry, too.
78 */
akmhoque53353462014-04-22 08:43:45 -050079 void
akmhoque31d1d4b2014-05-05 22:08:14 -050080 addEntry(const ndn::Name& name, const ndn::Name& destRouter);
akmhoquefdbddb12014-05-02 18:35:19 -050081
Nick Gordonb50e51b2016-07-22 16:05:57 -050082 /*! \brief Removes a destination from a name prefix table entry.
83 \param name The name prefix
84 \param destRouter The destination.
85
86 This method removes a destination from an entry. It will not fail
87 if an invalid name/destination pair are passed. After removal, if
88 the RoutingTablePoolEntry has a use count of 0, it is deleted from
89 the table. Additionally, if the name prefix has no routing table
90 entries associated with it, it is deleted from the NPT. In any
91 case, the FIB is informed of the changes.
92 */
akmhoquefdbddb12014-05-02 18:35:19 -050093 void
akmhoque31d1d4b2014-05-05 22:08:14 -050094 removeEntry(const ndn::Name& name, const ndn::Name& destRouter);
akmhoque53353462014-04-22 08:43:45 -050095
Nick Gordonb50e51b2016-07-22 16:05:57 -050096 /*! \brief Updates all routing information in the NPT.
97
Nick Gordonb7b58392017-08-17 16:29:21 -050098 Takes in a list of entries that are assumed to be exhaustive, and
99 updates each pool entry with the next hop information contained in
100 the corresponding entry in entries. If no entry is found, it is
101 assumed that the destination for that pool entry is inaccessible,
102 and its next hop information is deleted.
Nick Gordonb50e51b2016-07-22 16:05:57 -0500103 */
akmhoque53353462014-04-22 08:43:45 -0500104 void
Nick Gordonb7b58392017-08-17 16:29:21 -0500105 updateWithNewRoute(const std::list<RoutingTableEntry>& entries);
akmhoque53353462014-04-22 08:43:45 -0500106
Nick Gordonb50e51b2016-07-22 16:05:57 -0500107 /*! \brief Adds a pool entry to the pool.
108 \param rtpe The entry.
109
110 \return A shared_ptr to the entry, now in the pool.
111
112 Adds a RoutingTablePoolEntry to the NPT's local pool. Shared
113 pointers are used because it eliminates complicated hacks to deal
114 with lifetime issues, and to simplify memory management.
115 */
116 std::shared_ptr<RoutingTablePoolEntry>
117 addRtpeToPool(RoutingTablePoolEntry& rtpe);
118
119 /*! \brief Removes a pool entry from the pool.
120 \param rtpePtr The shared_ptr to the entry.
121
122 Removes a pool entry from the pool. Comparing these shared_ptrs
123 should not be a problem, because the same pointer is moved around,
124 all sourced from this central location. A more robust solution is
125 certainly possible, though.
126 */
127 void
128 deleteRtpeFromPool(std::shared_ptr<RoutingTablePoolEntry> rtpePtr);
129
akmhoque53353462014-04-22 08:43:45 -0500130 void
akmhoque674b0b12014-05-20 14:33:28 -0500131 writeLog();
132
Vince Lehmancae33b62015-06-05 09:21:30 -0500133 const_iterator
134 begin() const;
135
136 const_iterator
137 end() const;
138
Nick Gordonb50e51b2016-07-22 16:05:57 -0500139PUBLIC_WITH_TESTS_ELSE_PRIVATE:
Nick Gordonc0c6bcf2017-08-15 18:11:21 -0500140 RoutingTableEntryPool m_rtpool;
141
Nick Gordonb50e51b2016-07-22 16:05:57 -0500142 NptEntryList m_table;
akmhoque53353462014-04-22 08:43:45 -0500143
144private:
Ashlesh Gawande5d93aa52020-06-13 18:57:45 -0700145 const ndn::Name& m_ownRouterName;
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600146 Fib& m_fib;
147 RoutingTable& m_routingTable;
Junxiao Shi43f37a02023-08-09 00:09:00 +0000148 ndn::signal::Connection m_afterRoutingChangeConnection;
149 ndn::signal::Connection m_afterLsdbModified;
awlane6d7c37f2025-03-07 11:53:58 -0600150 std::map<std::tuple<ndn::Name, ndn::Name>, double> m_nexthopCost;
akmhoque53353462014-04-22 08:43:45 -0500151};
152
Vince Lehmancae33b62015-06-05 09:21:30 -0500153inline NamePrefixTable::const_iterator
154NamePrefixTable::begin() const
155{
156 return m_table.begin();
157}
akmhoque53353462014-04-22 08:43:45 -0500158
Vince Lehmancae33b62015-06-05 09:21:30 -0500159inline NamePrefixTable::const_iterator
160NamePrefixTable::end() const
161{
162 return m_table.end();
163}
164
165std::ostream&
166operator<<(std::ostream& os, const NamePrefixTable& table);
167
168} // namespace nlsr
169
170#endif // NLSR_NAME_PREFIX_TABLE_HPP