blob: 370e5157b80d03464e75dcc94240fff6cf1aeed9 [file] [log] [blame]
akmhoque3d06e792014-05-27 16:23:20 -05001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Ashlesh Gawande0db4d4d2020-02-05 20:30:02 -08003 * Copyright (c) 2014-2020, 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/>.
akmhoque3d06e792014-05-27 16:23:20 -050020 **/
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"
akmhoque53353462014-04-22 08:43:45 -050030
Vince Lehmancae33b62015-06-05 09:21:30 -050031#include <list>
Nick Gordonb50e51b2016-07-22 16:05:57 -050032#include <unordered_map>
Vince Lehmancae33b62015-06-05 09:21:30 -050033
akmhoque53353462014-04-22 08:43:45 -050034namespace nlsr {
akmhoque53353462014-04-22 08:43:45 -050035
akmhoquec8a10f72014-04-25 18:42:55 -050036class NamePrefixTable
akmhoque53353462014-04-22 08:43:45 -050037{
38public:
Nick Gordonc0c6bcf2017-08-15 18:11:21 -050039 using RoutingTableEntryPool =
40 std::unordered_map<ndn::Name, std::shared_ptr<RoutingTablePoolEntry>>;
41 using NptEntryList = std::list<std::shared_ptr<NamePrefixTableEntry>>;
42 using const_iterator = NptEntryList::const_iterator;
Nick Gordonb50e51b2016-07-22 16:05:57 -050043
Ashlesh Gawande85998a12017-12-07 22:22:13 -060044 NamePrefixTable(Fib& fib, RoutingTable& routingTable,
45 std::unique_ptr<AfterRoutingChange>& afterRoutingChangeSignal);
Nick Gordonb7b58392017-08-17 16:29:21 -050046
47 ~NamePrefixTable();
akmhoque53353462014-04-22 08:43:45 -050048
Nick Gordonb50e51b2016-07-22 16:05:57 -050049 /*! \brief Adds a destination to the specified name prefix.
50 \param name The name prefix
51 \param destRouter The destination router prefix
Nick G97e34942016-07-11 14:46:27 -050052
Nick Gordonb50e51b2016-07-22 16:05:57 -050053 This method adds a router to a name prefix table entry. If the
54 name prefix table entry does not exist, it is created. The method
55 will first look through its local pool of cached entries to find
56 the routing information for destRouter. If it is not found there,
57 it will construct one and fill it with information from an
58 appropriate RoutingTableEntry in the routing table. If there isn't
59 a match, it will instantiate it with no next hops. The FIB will be
60 notified of the change to the NPT entry, too.
61 */
akmhoque53353462014-04-22 08:43:45 -050062 void
akmhoque31d1d4b2014-05-05 22:08:14 -050063 addEntry(const ndn::Name& name, const ndn::Name& destRouter);
akmhoquefdbddb12014-05-02 18:35:19 -050064
Nick Gordonb50e51b2016-07-22 16:05:57 -050065 /*! \brief Removes a destination from a name prefix table entry.
66 \param name The name prefix
67 \param destRouter The destination.
68
69 This method removes a destination from an entry. It will not fail
70 if an invalid name/destination pair are passed. After removal, if
71 the RoutingTablePoolEntry has a use count of 0, it is deleted from
72 the table. Additionally, if the name prefix has no routing table
73 entries associated with it, it is deleted from the NPT. In any
74 case, the FIB is informed of the changes.
75 */
akmhoquefdbddb12014-05-02 18:35:19 -050076 void
akmhoque31d1d4b2014-05-05 22:08:14 -050077 removeEntry(const ndn::Name& name, const ndn::Name& destRouter);
akmhoque53353462014-04-22 08:43:45 -050078
Nick Gordonb50e51b2016-07-22 16:05:57 -050079 /*! \brief Updates all routing information in the NPT.
80
Nick Gordonb7b58392017-08-17 16:29:21 -050081 Takes in a list of entries that are assumed to be exhaustive, and
82 updates each pool entry with the next hop information contained in
83 the corresponding entry in entries. If no entry is found, it is
84 assumed that the destination for that pool entry is inaccessible,
85 and its next hop information is deleted.
Nick Gordonb50e51b2016-07-22 16:05:57 -050086 */
akmhoque53353462014-04-22 08:43:45 -050087 void
Nick Gordonb7b58392017-08-17 16:29:21 -050088 updateWithNewRoute(const std::list<RoutingTableEntry>& entries);
akmhoque53353462014-04-22 08:43:45 -050089
Nick Gordonb50e51b2016-07-22 16:05:57 -050090 /*! \brief Adds a pool entry to the pool.
91 \param rtpe The entry.
92
93 \return A shared_ptr to the entry, now in the pool.
94
95 Adds a RoutingTablePoolEntry to the NPT's local pool. Shared
96 pointers are used because it eliminates complicated hacks to deal
97 with lifetime issues, and to simplify memory management.
98 */
99 std::shared_ptr<RoutingTablePoolEntry>
100 addRtpeToPool(RoutingTablePoolEntry& rtpe);
101
102 /*! \brief Removes a pool entry from the pool.
103 \param rtpePtr The shared_ptr to the entry.
104
105 Removes a pool entry from the pool. Comparing these shared_ptrs
106 should not be a problem, because the same pointer is moved around,
107 all sourced from this central location. A more robust solution is
108 certainly possible, though.
109 */
110 void
111 deleteRtpeFromPool(std::shared_ptr<RoutingTablePoolEntry> rtpePtr);
112
akmhoque53353462014-04-22 08:43:45 -0500113 void
akmhoque674b0b12014-05-20 14:33:28 -0500114 writeLog();
115
Vince Lehmancae33b62015-06-05 09:21:30 -0500116 const_iterator
117 begin() const;
118
119 const_iterator
120 end() const;
121
Nick Gordonb50e51b2016-07-22 16:05:57 -0500122PUBLIC_WITH_TESTS_ELSE_PRIVATE:
Nick Gordonc0c6bcf2017-08-15 18:11:21 -0500123 RoutingTableEntryPool m_rtpool;
124
Nick Gordonb50e51b2016-07-22 16:05:57 -0500125 NptEntryList m_table;
akmhoque53353462014-04-22 08:43:45 -0500126
127private:
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600128 Fib& m_fib;
129 RoutingTable& m_routingTable;
Nick Gordonb7b58392017-08-17 16:29:21 -0500130 ndn::util::signal::Connection m_afterRoutingChangeConnection;
akmhoque53353462014-04-22 08:43:45 -0500131};
132
Vince Lehmancae33b62015-06-05 09:21:30 -0500133inline NamePrefixTable::const_iterator
134NamePrefixTable::begin() const
135{
136 return m_table.begin();
137}
akmhoque53353462014-04-22 08:43:45 -0500138
Vince Lehmancae33b62015-06-05 09:21:30 -0500139inline NamePrefixTable::const_iterator
140NamePrefixTable::end() const
141{
142 return m_table.end();
143}
144
145std::ostream&
146operator<<(std::ostream& os, const NamePrefixTable& table);
147
148} // namespace nlsr
149
150#endif // NLSR_NAME_PREFIX_TABLE_HPP