blob: 3e91ea5c4c8769aac3b1ef0b5405e87c8b88ccc9 [file] [log] [blame]
akmhoque3d06e792014-05-27 16:23:20 -05001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Nick Gordonc6a85222017-01-03 16:54:34 -06003 * Copyright (c) 2014-2017, 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"
27
28#include "test-access-control.hpp"
akmhoque53353462014-04-22 08:43:45 -050029
Vince Lehmancae33b62015-06-05 09:21:30 -050030#include <list>
Nick Gordonb50e51b2016-07-22 16:05:57 -050031#include <unordered_map>
Vince Lehmancae33b62015-06-05 09:21:30 -050032
akmhoque53353462014-04-22 08:43:45 -050033namespace nlsr {
34class Nlsr;
35
akmhoquec8a10f72014-04-25 18:42:55 -050036class NamePrefixTable
akmhoque53353462014-04-22 08:43:45 -050037{
38public:
Vince Lehmancae33b62015-06-05 09:21:30 -050039
40 typedef std::list<NamePrefixTableEntry> NptEntryList;
41 typedef NptEntryList::const_iterator const_iterator;
42
Nick Gordonb50e51b2016-07-22 16:05:57 -050043 typedef std::unordered_map<ndn::Name, std::shared_ptr<RoutingTablePoolEntry>>
44 RtpEntryMap;
45
akmhoque31d1d4b2014-05-05 22:08:14 -050046 NamePrefixTable(Nlsr& nlsr)
47 : m_nlsr(nlsr)
akmhoque53353462014-04-22 08:43:45 -050048 {
49 }
akmhoque53353462014-04-22 08:43:45 -050050
Nick Gordonb50e51b2016-07-22 16:05:57 -050051 /*! \brief Adds a destination to the specified name prefix.
52 \param name The name prefix
53 \param destRouter The destination router prefix
Nick G97e34942016-07-11 14:46:27 -050054
Nick Gordonb50e51b2016-07-22 16:05:57 -050055 This method adds a router to a name prefix table entry. If the
56 name prefix table entry does not exist, it is created. The method
57 will first look through its local pool of cached entries to find
58 the routing information for destRouter. If it is not found there,
59 it will construct one and fill it with information from an
60 appropriate RoutingTableEntry in the routing table. If there isn't
61 a match, it will instantiate it with no next hops. The FIB will be
62 notified of the change to the NPT entry, too.
63 */
akmhoque53353462014-04-22 08:43:45 -050064 void
akmhoque31d1d4b2014-05-05 22:08:14 -050065 addEntry(const ndn::Name& name, const ndn::Name& destRouter);
akmhoquefdbddb12014-05-02 18:35:19 -050066
Nick Gordonb50e51b2016-07-22 16:05:57 -050067 /*! \brief Removes a destination from a name prefix table entry.
68 \param name The name prefix
69 \param destRouter The destination.
70
71 This method removes a destination from an entry. It will not fail
72 if an invalid name/destination pair are passed. After removal, if
73 the RoutingTablePoolEntry has a use count of 0, it is deleted from
74 the table. Additionally, if the name prefix has no routing table
75 entries associated with it, it is deleted from the NPT. In any
76 case, the FIB is informed of the changes.
77 */
akmhoquefdbddb12014-05-02 18:35:19 -050078 void
akmhoque31d1d4b2014-05-05 22:08:14 -050079 removeEntry(const ndn::Name& name, const ndn::Name& destRouter);
akmhoque53353462014-04-22 08:43:45 -050080
Nick Gordonb50e51b2016-07-22 16:05:57 -050081 /*! \brief Updates all routing information in the NPT.
82
83 Naively iterates over all the NPT entries, then over each of their
84 RoutingTablePoolEntries, passing the name/destination pair back to
85 addEntry after updating the pool entry with new information. This
86 ensures that the FIB is appropriately apprised of any changes to a
87 prefix's preferred next hops.
88 */
akmhoque53353462014-04-22 08:43:45 -050089 void
akmhoque31d1d4b2014-05-05 22:08:14 -050090 updateWithNewRoute();
akmhoque53353462014-04-22 08:43:45 -050091
Nick Gordonb50e51b2016-07-22 16:05:57 -050092 /*! \brief Adds a pool entry to the pool.
93 \param rtpe The entry.
94
95 \return A shared_ptr to the entry, now in the pool.
96
97 Adds a RoutingTablePoolEntry to the NPT's local pool. Shared
98 pointers are used because it eliminates complicated hacks to deal
99 with lifetime issues, and to simplify memory management.
100 */
101 std::shared_ptr<RoutingTablePoolEntry>
102 addRtpeToPool(RoutingTablePoolEntry& rtpe);
103
104 /*! \brief Removes a pool entry from the pool.
105 \param rtpePtr The shared_ptr to the entry.
106
107 Removes a pool entry from the pool. Comparing these shared_ptrs
108 should not be a problem, because the same pointer is moved around,
109 all sourced from this central location. A more robust solution is
110 certainly possible, though.
111 */
112 void
113 deleteRtpeFromPool(std::shared_ptr<RoutingTablePoolEntry> rtpePtr);
114
akmhoque53353462014-04-22 08:43:45 -0500115 void
akmhoque674b0b12014-05-20 14:33:28 -0500116 writeLog();
117
Vince Lehmancae33b62015-06-05 09:21:30 -0500118 const_iterator
119 begin() const;
120
121 const_iterator
122 end() const;
123
Nick Gordonb50e51b2016-07-22 16:05:57 -0500124PUBLIC_WITH_TESTS_ELSE_PRIVATE:
125 RtpEntryMap m_rtpool;
126 NptEntryList m_table;
akmhoque53353462014-04-22 08:43:45 -0500127
128private:
akmhoque31d1d4b2014-05-05 22:08:14 -0500129 Nlsr& m_nlsr;
Nick Gordonb50e51b2016-07-22 16:05:57 -0500130
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
Nick Gordonb50e51b2016-07-22 16:05:57 -0500145bool
146npteCompare(NamePrefixTableEntry& npte, const ndn::Name& name);
147
Vince Lehmancae33b62015-06-05 09:21:30 -0500148std::ostream&
149operator<<(std::ostream& os, const NamePrefixTable& table);
150
151} // namespace nlsr
152
153#endif // NLSR_NAME_PREFIX_TABLE_HPP