blob: d28cb90bd2c6a7f27587ced701da33e886a11d72 [file] [log] [blame]
Junxiao Shicbba04c2014-01-26 14:21:22 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Junxiao Shifef73e42016-03-29 14:15:05 -07003 * Copyright (c) 2014-2016, Regents of the University of California,
Junxiao Shi1e46be32015-01-08 20:18:05 -07004 * 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/>.
Alexander Afanasyev28d586a2014-07-10 20:10:54 -070024 */
Junxiao Shicbba04c2014-01-26 14:21:22 -070025
Alexander Afanasyev613e2a92014-04-15 13:36:58 -070026#ifndef NFD_DAEMON_TABLE_PIT_ENTRY_HPP
27#define NFD_DAEMON_TABLE_PIT_ENTRY_HPP
Junxiao Shicbba04c2014-01-26 14:21:22 -070028
29#include "pit-in-record.hpp"
30#include "pit-out-record.hpp"
Junxiao Shid3c792f2014-01-30 00:46:13 -070031#include "core/scheduler.hpp"
Junxiao Shicbba04c2014-01-26 14:21:22 -070032
Alexander Afanasyev18bbf812014-01-29 01:40:23 -080033namespace nfd {
HangZhangcb4fc832014-03-11 16:57:11 +080034
HangZhangcb4fc832014-03-11 16:57:11 +080035namespace name_tree {
36class Entry;
Junxiao Shifef73e42016-03-29 14:15:05 -070037} // namespace name_tree
HangZhangcb4fc832014-03-11 16:57:11 +080038
Junxiao Shicbba04c2014-01-26 14:21:22 -070039namespace pit {
40
Junxiao Shi4846f372016-04-05 13:39:30 -070041/** \brief an unordered collection of in-records
Junxiao Shicbba04c2014-01-26 14:21:22 -070042 */
Junxiao Shi4846f372016-04-05 13:39:30 -070043typedef std::list<InRecord> InRecordCollection;
Junxiao Shicbba04c2014-01-26 14:21:22 -070044
Junxiao Shi4846f372016-04-05 13:39:30 -070045/** \brief an unordered collection of out-records
Junxiao Shicbba04c2014-01-26 14:21:22 -070046 */
47typedef std::list<OutRecord> OutRecordCollection;
48
Junxiao Shi4846f372016-04-05 13:39:30 -070049/** \brief an Interest table entry
50 *
51 * An Interest table entry represents either a pending Interest or a recently satisfied Interest.
52 * Each entry contains a collection of in-records, a collection of out-records,
53 * and two timers used in forwarding pipelines.
54 * In addition, the entry, in-records, and out-records are subclasses of StrategyInfoHost,
55 * which allows forwarding strategy to store arbitrary information on them.
Junxiao Shicbba04c2014-01-26 14:21:22 -070056 */
Junxiao Shi408a7002014-02-12 17:53:47 -070057class Entry : public StrategyInfoHost, noncopyable
Junxiao Shicbba04c2014-01-26 14:21:22 -070058{
59public:
60 explicit
61 Entry(const Interest& interest);
Junxiao Shi0b5fbbb2014-02-20 15:54:03 -070062
Junxiao Shi4846f372016-04-05 13:39:30 -070063 /** \return the representative Interest of the PIT entry
64 * \note Every Interest in in-records and out-records should have same Name and Selectors
65 * as the representative Interest.
66 * \todo #3162 require Link field to match the representative Interest
67 */
Junxiao Shicbba04c2014-01-26 14:21:22 -070068 const Interest&
Junxiao Shi340d5532016-08-13 04:00:35 +000069 getInterest() const
70 {
71 return *m_interest;
72 }
Junxiao Shi0b5fbbb2014-02-20 15:54:03 -070073
74 /** \return Interest Name
Junxiao Shicbba04c2014-01-26 14:21:22 -070075 */
76 const Name&
Junxiao Shi340d5532016-08-13 04:00:35 +000077 getName() const
78 {
79 return m_interest->getName();
80 }
Junxiao Shi0b5fbbb2014-02-20 15:54:03 -070081
Junxiao Shi4846f372016-04-05 13:39:30 -070082public: // in-record
83 /** \return collection of in-records
84 */
Junxiao Shi66f91f82014-05-10 17:28:58 -070085 const InRecordCollection&
Junxiao Shi340d5532016-08-13 04:00:35 +000086 getInRecords() const
87 {
88 return m_inRecords;
89 }
Junxiao Shi66f91f82014-05-10 17:28:58 -070090
Junxiao Shi4846f372016-04-05 13:39:30 -070091 /** \retval true There is at least one in-record.
92 * This implies some downstream is waiting for Data or Nack.
93 * \retval false There is no in-record.
94 * This implies the entry is new or has been satisfied or Nacked.
95 */
96 bool
Junxiao Shi340d5532016-08-13 04:00:35 +000097 hasInRecords() const
98 {
99 return !m_inRecords.empty();
100 }
Junxiao Shi4846f372016-04-05 13:39:30 -0700101
102 InRecordCollection::iterator
Junxiao Shi340d5532016-08-13 04:00:35 +0000103 in_begin()
104 {
105 return m_inRecords.begin();
106 }
Junxiao Shi4846f372016-04-05 13:39:30 -0700107
108 InRecordCollection::const_iterator
Junxiao Shi340d5532016-08-13 04:00:35 +0000109 in_begin() const
110 {
111 return m_inRecords.begin();
112 }
Junxiao Shi4846f372016-04-05 13:39:30 -0700113
114 InRecordCollection::iterator
Junxiao Shi340d5532016-08-13 04:00:35 +0000115 in_end()
116 {
117 return m_inRecords.end();
118 }
Junxiao Shi4846f372016-04-05 13:39:30 -0700119
120 InRecordCollection::const_iterator
Junxiao Shi340d5532016-08-13 04:00:35 +0000121 in_end() const
122 {
123 return m_inRecords.end();
124 }
Junxiao Shi4846f372016-04-05 13:39:30 -0700125
126 /** \brief get the in-record for \p face
127 * \return an iterator to the in-record, or .in_end() if it does not exist
128 */
129 InRecordCollection::iterator
130 getInRecord(const Face& face);
131
132 /** \brief insert or update an in-record
133 * \return an iterator to the new or updated in-record
Junxiao Shicbba04c2014-01-26 14:21:22 -0700134 */
135 InRecordCollection::iterator
Junxiao Shi9cff7792016-08-01 21:45:11 +0000136 insertOrUpdateInRecord(Face& face, const Interest& interest);
Junxiao Shi0b5fbbb2014-02-20 15:54:03 -0700137
Junxiao Shi4846f372016-04-05 13:39:30 -0700138 /** \brief delete the in-record for \p face if it exists
Junxiao Shi66f91f82014-05-10 17:28:58 -0700139 */
Junxiao Shi5e5e4452015-09-24 16:56:52 -0700140 void
141 deleteInRecord(const Face& face);
142
Junxiao Shi4846f372016-04-05 13:39:30 -0700143 /** \brief delete all in-records
144 */
Junxiao Shicbba04c2014-01-26 14:21:22 -0700145 void
Junxiao Shi4846f372016-04-05 13:39:30 -0700146 clearInRecords();
Junxiao Shi0b5fbbb2014-02-20 15:54:03 -0700147
Junxiao Shi4846f372016-04-05 13:39:30 -0700148public: // out-record
149 /** \return collection of in-records
150 */
Junxiao Shi66f91f82014-05-10 17:28:58 -0700151 const OutRecordCollection&
Junxiao Shi340d5532016-08-13 04:00:35 +0000152 getOutRecords() const
153 {
154 return m_outRecords;
155 }
Junxiao Shi66f91f82014-05-10 17:28:58 -0700156
Junxiao Shi4846f372016-04-05 13:39:30 -0700157 /** \retval true There is at least one out-record.
158 * This implies the Interest has been forwarded to some upstream,
159 * and they haven't returned Data, but may have returned Nacks.
160 * \retval false There is no out-record.
161 * This implies the Interest has not been forwarded.
Junxiao Shicbba04c2014-01-26 14:21:22 -0700162 */
Junxiao Shi4846f372016-04-05 13:39:30 -0700163 bool
Junxiao Shi340d5532016-08-13 04:00:35 +0000164 hasOutRecords() const
165 {
166 return !m_outRecords.empty();
167 }
Junxiao Shi0b5fbbb2014-02-20 15:54:03 -0700168
Junxiao Shi4846f372016-04-05 13:39:30 -0700169 OutRecordCollection::iterator
Junxiao Shi340d5532016-08-13 04:00:35 +0000170 out_begin()
171 {
172 return m_outRecords.begin();
173 }
Junxiao Shi4846f372016-04-05 13:39:30 -0700174
175 OutRecordCollection::const_iterator
Junxiao Shi340d5532016-08-13 04:00:35 +0000176 out_begin() const
177 {
178 return m_outRecords.begin();
179 }
Junxiao Shi4846f372016-04-05 13:39:30 -0700180
181 OutRecordCollection::iterator
Junxiao Shi340d5532016-08-13 04:00:35 +0000182 out_end()
183 {
184 return m_outRecords.end();
185 }
Junxiao Shi4846f372016-04-05 13:39:30 -0700186
187 OutRecordCollection::const_iterator
Junxiao Shi340d5532016-08-13 04:00:35 +0000188 out_end() const
189 {
190 return m_outRecords.end();
191 }
Junxiao Shi4846f372016-04-05 13:39:30 -0700192
193 /** \brief get the out-record for \p face
194 * \return an iterator to the out-record, or .out_end() if it does not exist
Junxiao Shi66f91f82014-05-10 17:28:58 -0700195 */
Junxiao Shi5e5e4452015-09-24 16:56:52 -0700196 OutRecordCollection::iterator
197 getOutRecord(const Face& face);
Junxiao Shi66f91f82014-05-10 17:28:58 -0700198
Junxiao Shi4846f372016-04-05 13:39:30 -0700199 /** \brief insert or update an out-record
200 * \return an iterator to the new or updated out-record
201 */
202 OutRecordCollection::iterator
Junxiao Shi9cff7792016-08-01 21:45:11 +0000203 insertOrUpdateOutRecord(Face& face, const Interest& interest);
Junxiao Shi4846f372016-04-05 13:39:30 -0700204
205 /** \brief delete the out-record for \p face if it exists
206 */
Junxiao Shicbba04c2014-01-26 14:21:22 -0700207 void
Junxiao Shib2bcbcd2014-11-08 09:30:28 -0700208 deleteOutRecord(const Face& face);
Junxiao Shi0b5fbbb2014-02-20 15:54:03 -0700209
Junxiao Shid3c792f2014-01-30 00:46:13 -0700210public:
Junxiao Shi4846f372016-04-05 13:39:30 -0700211 /** \brief unsatisfy timer
212 *
213 * This timer is used in forwarding pipelines to delete the entry
214 * when it expires without being satisfied.
215 * It fires when the last InterestLifetime among in-records expires.
216 *
217 * Either this or the straggler timer should be set at all times,
218 * except when this entry is being processed in a pipeline.
219 */
Junxiao Shi1e46be32015-01-08 20:18:05 -0700220 scheduler::EventId m_unsatisfyTimer;
Junxiao Shi4846f372016-04-05 13:39:30 -0700221
222 /** \brief straggler timer
223 *
224 * This timer is used in forwarding pipelines to delete the entry when it has been satisfied
225 * and is no longer needed for measurement collection purpose.
226 *
227 * Either this or the unsatisfy timer should be set at all times,
228 * except when this entry is being processed in a pipeline.
229 */
Junxiao Shi1e46be32015-01-08 20:18:05 -0700230 scheduler::EventId m_stragglerTimer;
Junxiao Shicbba04c2014-01-26 14:21:22 -0700231
232private:
Alexander Afanasyev28d586a2014-07-10 20:10:54 -0700233 shared_ptr<const Interest> m_interest;
Junxiao Shicbba04c2014-01-26 14:21:22 -0700234 InRecordCollection m_inRecords;
235 OutRecordCollection m_outRecords;
Junxiao Shi57f0f312014-03-16 11:52:20 -0700236
Junxiao Shi340d5532016-08-13 04:00:35 +0000237 name_tree::Entry* m_nameTreeEntry;
HangZhangcb4fc832014-03-11 16:57:11 +0800238
Junxiao Shi340d5532016-08-13 04:00:35 +0000239 friend class name_tree::Entry;
Junxiao Shicbba04c2014-01-26 14:21:22 -0700240};
241
Junxiao Shicbba04c2014-01-26 14:21:22 -0700242} // namespace pit
Alexander Afanasyev18bbf812014-01-29 01:40:23 -0800243} // namespace nfd
Junxiao Shicbba04c2014-01-26 14:21:22 -0700244
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700245#endif // NFD_DAEMON_TABLE_PIT_ENTRY_HPP