blob: 9a280c2e5552228fbacb9df64178960c322d5009 [file] [log] [blame]
Junxiao Shidbe71732014-02-21 22:23:28 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Junxiao Shi35353962015-01-08 09:13:47 -07003 * Copyright (c) 2014-2015, Regents of the University of California,
4 * Arizona Board of Regents,
5 * Colorado State University,
6 * University Pierre & Marie Curie, Sorbonne University,
7 * Washington University in St. Louis,
8 * Beijing Institute of Technology,
9 * The University of Memphis.
Alexander Afanasyev9bcbc7c2014-04-06 19:37:37 -070010 *
11 * This file is part of NFD (Named Data Networking Forwarding Daemon).
12 * See AUTHORS.md for complete list of NFD authors and contributors.
13 *
14 * NFD is free software: you can redistribute it and/or modify it under the terms
15 * of the GNU General Public License as published by the Free Software Foundation,
16 * either version 3 of the License, or (at your option) any later version.
17 *
18 * NFD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
19 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
20 * PURPOSE. See the GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License along with
23 * NFD, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
Junxiao Shiee5a4442014-07-27 17:13:43 -070024 */
Junxiao Shidbe71732014-02-21 22:23:28 -070025
Alexander Afanasyev613e2a92014-04-15 13:36:58 -070026#ifndef NFD_DAEMON_TABLE_MEASUREMENTS_ACCESSOR_HPP
27#define NFD_DAEMON_TABLE_MEASUREMENTS_ACCESSOR_HPP
Junxiao Shidbe71732014-02-21 22:23:28 -070028
29#include "measurements.hpp"
Junxiao Shi7bb01512014-03-05 21:34:09 -070030#include "strategy-choice.hpp"
Junxiao Shidbe71732014-02-21 22:23:28 -070031
32namespace nfd {
33
34namespace fw {
35class Strategy;
36}
37
38/** \brief allows Strategy to access portion of Measurements table under its namespace
39 */
40class MeasurementsAccessor : noncopyable
41{
42public:
Junxiao Shi35353962015-01-08 09:13:47 -070043 MeasurementsAccessor(Measurements& measurements, const StrategyChoice& strategyChoice,
44 const fw::Strategy& strategy);
Junxiao Shidbe71732014-02-21 22:23:28 -070045
46 ~MeasurementsAccessor();
47
Junxiao Shi35353962015-01-08 09:13:47 -070048 /** \brief find or insert a Measurements entry for \p name
Junxiao Shie368d992014-12-02 23:44:31 -070049 */
Junxiao Shidbe71732014-02-21 22:23:28 -070050 shared_ptr<measurements::Entry>
51 get(const Name& name);
52
Junxiao Shi35353962015-01-08 09:13:47 -070053 /** \brief find or insert a Measurements entry for \p fibEntry->getPrefix()
Junxiao Shie368d992014-12-02 23:44:31 -070054 */
Junxiao Shidbe71732014-02-21 22:23:28 -070055 shared_ptr<measurements::Entry>
56 get(const fib::Entry& fibEntry);
57
Junxiao Shi35353962015-01-08 09:13:47 -070058 /** \brief find or insert a Measurements entry for \p pitEntry->getName()
Junxiao Shie368d992014-12-02 23:44:31 -070059 */
Junxiao Shidbe71732014-02-21 22:23:28 -070060 shared_ptr<measurements::Entry>
61 get(const pit::Entry& pitEntry);
62
63 /** \brief find or insert a Measurements entry for child's parent
Junxiao Shie368d992014-12-02 23:44:31 -070064 * \retval nullptr if child is the root entry
Junxiao Shidbe71732014-02-21 22:23:28 -070065 */
66 shared_ptr<measurements::Entry>
Junxiao Shie368d992014-12-02 23:44:31 -070067 getParent(const measurements::Entry& child);
Junxiao Shidbe71732014-02-21 22:23:28 -070068
Junxiao Shi35353962015-01-08 09:13:47 -070069 /** \brief perform a longest prefix match for \p name
70 */
71 shared_ptr<measurements::Entry>
72 findLongestPrefixMatch(const Name& name,
73 const measurements::EntryPredicate& pred =
74 measurements::AnyEntry()) const;
75
76 /** \brief perform a longest prefix match for \p pitEntry.getName()
77 */
78 shared_ptr<measurements::Entry>
79 findLongestPrefixMatch(const pit::Entry& pitEntry,
80 const measurements::EntryPredicate& pred =
81 measurements::AnyEntry()) const;
82
83 /** \brief perform an exact match
84 */
85 shared_ptr<measurements::Entry>
86 findExactMatch(const Name& name) const;
87
Junxiao Shidbe71732014-02-21 22:23:28 -070088 /** \brief extend lifetime of an entry
89 *
90 * The entry will be kept until at least now()+lifetime.
91 */
92 void
Junxiao Shie368d992014-12-02 23:44:31 -070093 extendLifetime(measurements::Entry& entry, const time::nanoseconds& lifetime);
Junxiao Shidbe71732014-02-21 22:23:28 -070094
95private:
96 /** \brief perform access control to Measurements entry
Junxiao Shie368d992014-12-02 23:44:31 -070097 * \return entry if strategy has access to namespace, otherwise nullptr
Junxiao Shidbe71732014-02-21 22:23:28 -070098 */
99 shared_ptr<measurements::Entry>
Junxiao Shi35353962015-01-08 09:13:47 -0700100 filter(const shared_ptr<measurements::Entry>& entry) const;
Junxiao Shidbe71732014-02-21 22:23:28 -0700101
102private:
103 Measurements& m_measurements;
Junxiao Shi35353962015-01-08 09:13:47 -0700104 const StrategyChoice& m_strategyChoice;
105 const fw::Strategy* m_strategy;
Junxiao Shidbe71732014-02-21 22:23:28 -0700106};
107
108inline shared_ptr<measurements::Entry>
109MeasurementsAccessor::get(const Name& name)
110{
111 return this->filter(m_measurements.get(name));
112}
113
114inline shared_ptr<measurements::Entry>
115MeasurementsAccessor::get(const fib::Entry& fibEntry)
116{
Junxiao Shi7bb01512014-03-05 21:34:09 -0700117 return this->filter(m_measurements.get(fibEntry));
Junxiao Shidbe71732014-02-21 22:23:28 -0700118}
119
120inline shared_ptr<measurements::Entry>
121MeasurementsAccessor::get(const pit::Entry& pitEntry)
122{
123 return this->filter(m_measurements.get(pitEntry));
124}
125
126inline shared_ptr<measurements::Entry>
Junxiao Shie368d992014-12-02 23:44:31 -0700127MeasurementsAccessor::getParent(const measurements::Entry& child)
Junxiao Shidbe71732014-02-21 22:23:28 -0700128{
129 return this->filter(m_measurements.getParent(child));
130}
131
Junxiao Shi35353962015-01-08 09:13:47 -0700132inline shared_ptr<measurements::Entry>
133MeasurementsAccessor::findLongestPrefixMatch(const Name& name,
134 const measurements::EntryPredicate& pred) const
135{
136 return this->filter(m_measurements.findLongestPrefixMatch(name, pred));
137}
138
139inline shared_ptr<measurements::Entry>
140MeasurementsAccessor::findLongestPrefixMatch(const pit::Entry& pitEntry,
141 const measurements::EntryPredicate& pred) const
142{
143 return this->filter(m_measurements.findLongestPrefixMatch(pitEntry, pred));
144}
145
146inline shared_ptr<measurements::Entry>
147MeasurementsAccessor::findExactMatch(const Name& name) const
148{
149 return this->filter(m_measurements.findExactMatch(name));
150}
151
Junxiao Shidbe71732014-02-21 22:23:28 -0700152inline void
Junxiao Shie368d992014-12-02 23:44:31 -0700153MeasurementsAccessor::extendLifetime(measurements::Entry& entry,
Junxiao Shiee5a4442014-07-27 17:13:43 -0700154 const time::nanoseconds& lifetime)
Junxiao Shidbe71732014-02-21 22:23:28 -0700155{
156 m_measurements.extendLifetime(entry, lifetime);
157}
158
159} // namespace nfd
160
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700161#endif // NFD_DAEMON_TABLE_MEASUREMENTS_ACCESSOR_HPP