blob: ee5885dd5c1ff819cb9cd04476d40e4f19d03bb1 [file] [log] [blame]
Vince Lehman8a4c29e2016-07-11 08:49:35 +00001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Ashlesh Gawande92e4ea52017-07-19 11:38:12 -05002/*
3 * Copyright (c) 2014-2018, Regents of the University of California,
Vince Lehman8a4c29e2016-07-11 08:49:35 +00004 * 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.
10 *
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/>.
24 */
25
26#ifndef NFD_DAEMON_FW_ASF_MEASUREMENTS_HPP
27#define NFD_DAEMON_FW_ASF_MEASUREMENTS_HPP
28
Eric Newberry185ab292017-03-28 06:45:39 +000029#include "core/rtt-estimator.hpp"
Vince Lehman8a4c29e2016-07-11 08:49:35 +000030#include "fw/strategy-info.hpp"
31#include "table/measurements-accessor.hpp"
32
33namespace nfd {
34namespace fw {
35namespace asf {
36
37class RttStats
38{
39public:
40 typedef time::duration<double, boost::micro> Rtt;
41
42 RttStats();
43
44 void
45 addRttMeasurement(RttEstimator::Duration& durationRtt);
46
47 void
48 recordTimeout()
49 {
50 m_rtt = RTT_TIMEOUT;
51 }
52
53 Rtt
54 getRtt() const
55 {
56 return m_rtt;
57 }
58
59 Rtt
60 getSrtt() const
61 {
62 return m_srtt;
63 }
64
65 RttEstimator::Duration
66 computeRto() const
67 {
68 return m_rttEstimator.computeRto();
69 }
70
71private:
72 static Rtt
73 computeSrtt(Rtt previousSrtt, Rtt currentRtt);
74
75public:
76 static const Rtt RTT_TIMEOUT;
77 static const Rtt RTT_NO_MEASUREMENT;
78
79private:
80 Rtt m_srtt;
81 Rtt m_rtt;
82 RttEstimator m_rttEstimator;
83
84 static const double ALPHA;
85};
86
87////////////////////////////////////////////////////////////////////////////////
88////////////////////////////////////////////////////////////////////////////////
89
90/** \brief Strategy information for each face in a namespace
91*/
92class FaceInfo
93{
94public:
95 class Error : public std::runtime_error
96 {
97 public:
98 explicit
99 Error(const std::string& what)
100 : std::runtime_error(what)
101 {
102 }
103 };
104
105 FaceInfo();
106
107 ~FaceInfo();
108
109 void
Junxiao Shifc021862016-08-25 21:51:18 +0000110 setTimeoutEvent(const scheduler::EventId& id, const Name& interestName);
Vince Lehman8a4c29e2016-07-11 08:49:35 +0000111
112 void
113 setMeasurementExpirationEventId(const scheduler::EventId& id)
114 {
115 m_measurementExpirationId = id;
116 }
117
118 const scheduler::EventId&
119 getMeasurementExpirationEventId()
120 {
121 return m_measurementExpirationId;
122 }
123
124 void
Junxiao Shifc021862016-08-25 21:51:18 +0000125 cancelTimeoutEvent(const Name& prefix);
Vince Lehman8a4c29e2016-07-11 08:49:35 +0000126
127 bool
128 isTimeoutScheduled() const
129 {
130 return m_isTimeoutScheduled;
131 }
132
133 void
Junxiao Shi15e98b02016-08-12 11:21:44 +0000134 recordRtt(const shared_ptr<pit::Entry>& pitEntry, const Face& inFace);
Vince Lehman8a4c29e2016-07-11 08:49:35 +0000135
136 void
Junxiao Shifc021862016-08-25 21:51:18 +0000137 recordTimeout(const Name& interestName);
Vince Lehman8a4c29e2016-07-11 08:49:35 +0000138
139 bool
140 isTimeout() const
141 {
142 return getRtt() == RttStats::RTT_TIMEOUT;
143 }
144
145 RttEstimator::Duration
146 computeRto() const
147 {
148 return m_rttStats.computeRto();
149 }
150
151 RttStats::Rtt
152 getRtt() const
153 {
154 return m_rttStats.getRtt();
155 }
156
157 RttStats::Rtt
158 getSrtt() const
159 {
160 return m_rttStats.getSrtt();
161 }
162
163 bool
164 hasSrttMeasurement() const
165 {
166 return getSrtt() != RttStats::RTT_NO_MEASUREMENT;
167 }
168
Ashlesh Gawande92e4ea52017-07-19 11:38:12 -0500169 size_t
170 getNSilentTimeouts() const
171 {
172 return m_nSilentTimeouts;
173 }
174
175 void
176 setNSilentTimeouts(size_t nSilentTimeouts)
177 {
178 m_nSilentTimeouts = nSilentTimeouts;
179 }
180
Vince Lehman8a4c29e2016-07-11 08:49:35 +0000181private:
182 void
183 cancelTimeoutEvent();
184
185 bool
Junxiao Shifc021862016-08-25 21:51:18 +0000186 doesNameMatchLastInterest(const Name& name);
Vince Lehman8a4c29e2016-07-11 08:49:35 +0000187
188private:
189 RttStats m_rttStats;
Junxiao Shifc021862016-08-25 21:51:18 +0000190 Name m_lastInterestName;
Vince Lehman8a4c29e2016-07-11 08:49:35 +0000191
192 // Timeout associated with measurement
193 scheduler::EventId m_measurementExpirationId;
194
195 // RTO associated with Interest
196 scheduler::EventId m_timeoutEventId;
197 bool m_isTimeoutScheduled;
Ashlesh Gawande92e4ea52017-07-19 11:38:12 -0500198 size_t m_nSilentTimeouts;
Vince Lehman8a4c29e2016-07-11 08:49:35 +0000199};
200
Ashlesh Gawande92e4ea52017-07-19 11:38:12 -0500201typedef std::unordered_map<FaceId, FaceInfo> FaceInfoTable;
Vince Lehman8a4c29e2016-07-11 08:49:35 +0000202
203////////////////////////////////////////////////////////////////////////////////
204////////////////////////////////////////////////////////////////////////////////
205
206/** \brief stores stategy information about each face in this namespace
207 */
208class NamespaceInfo : public StrategyInfo
209{
210public:
211 NamespaceInfo();
212
213 static constexpr int
214 getTypeId()
215 {
216 return 1030;
217 }
218
219 FaceInfo&
Ashlesh Gawande92e4ea52017-07-19 11:38:12 -0500220 getOrCreateFaceInfo(const fib::Entry& fibEntry, FaceId faceId);
Vince Lehman8a4c29e2016-07-11 08:49:35 +0000221
222 FaceInfo*
Ashlesh Gawande92e4ea52017-07-19 11:38:12 -0500223 getFaceInfo(const fib::Entry& fibEntry, FaceId faceId);
Vince Lehman8a4c29e2016-07-11 08:49:35 +0000224
225 void
Ashlesh Gawande92e4ea52017-07-19 11:38:12 -0500226 expireFaceInfo(FaceId faceId);
Vince Lehman8a4c29e2016-07-11 08:49:35 +0000227
228 void
Ashlesh Gawande92e4ea52017-07-19 11:38:12 -0500229 extendFaceInfoLifetime(FaceInfo& info, FaceId faceId);
Vince Lehman8a4c29e2016-07-11 08:49:35 +0000230
Ashlesh Gawandecad76b62017-04-04 15:28:30 -0500231 FaceInfo*
Ashlesh Gawande92e4ea52017-07-19 11:38:12 -0500232 get(FaceId faceId)
Vince Lehman8a4c29e2016-07-11 08:49:35 +0000233 {
Ashlesh Gawandecad76b62017-04-04 15:28:30 -0500234 if (m_fit.find(faceId) != m_fit.end()) {
235 return &m_fit.at(faceId);
236 }
237 else {
238 return nullptr;
239 }
Vince Lehman8a4c29e2016-07-11 08:49:35 +0000240 }
241
242 FaceInfoTable::iterator
Ashlesh Gawande92e4ea52017-07-19 11:38:12 -0500243 find(FaceId faceId)
Vince Lehman8a4c29e2016-07-11 08:49:35 +0000244 {
245 return m_fit.find(faceId);
246 }
247
248 FaceInfoTable::iterator
249 end()
250 {
251 return m_fit.end();
252 }
253
254 const FaceInfoTable::iterator
Ashlesh Gawande92e4ea52017-07-19 11:38:12 -0500255 insert(FaceId faceId)
Vince Lehman8a4c29e2016-07-11 08:49:35 +0000256 {
257 const auto& pair = m_fit.insert(std::make_pair(faceId, FaceInfo()));
258 return pair.first;
259 }
260
261 bool
262 isProbingDue() const
263 {
264 return m_isProbingDue;
265 }
266
267 void
268 setIsProbingDue(bool isProbingDue)
269 {
270 m_isProbingDue = isProbingDue;
271 }
272
273 bool
274 isFirstProbeScheduled() const
275 {
276 return m_hasFirstProbeBeenScheduled;
277 }
278
279 void
280 setHasFirstProbeBeenScheduled(bool hasBeenScheduled)
281 {
282 m_hasFirstProbeBeenScheduled = hasBeenScheduled;
283 }
284
285private:
286 FaceInfoTable m_fit;
287
288 bool m_isProbingDue;
289 bool m_hasFirstProbeBeenScheduled;
290};
291
292////////////////////////////////////////////////////////////////////////////////
293////////////////////////////////////////////////////////////////////////////////
294
295/** \brief Helper class to retrieve and create strategy measurements
296 */
297class AsfMeasurements : noncopyable
298{
299public:
300 explicit
301 AsfMeasurements(MeasurementsAccessor& measurements);
302
303 FaceInfo*
Ashlesh Gawande92e4ea52017-07-19 11:38:12 -0500304 getFaceInfo(const fib::Entry& fibEntry, const Interest& interest, FaceId faceId);
Vince Lehman8a4c29e2016-07-11 08:49:35 +0000305
306 FaceInfo&
Ashlesh Gawande92e4ea52017-07-19 11:38:12 -0500307 getOrCreateFaceInfo(const fib::Entry& fibEntry, const Interest& interest, FaceId faceId);
Vince Lehman8a4c29e2016-07-11 08:49:35 +0000308
Junxiao Shifc021862016-08-25 21:51:18 +0000309 NamespaceInfo*
310 getNamespaceInfo(const Name& prefix);
Vince Lehman8a4c29e2016-07-11 08:49:35 +0000311
312 NamespaceInfo&
Junxiao Shifc021862016-08-25 21:51:18 +0000313 getOrCreateNamespaceInfo(const fib::Entry& fibEntry, const Interest& interest);
Vince Lehman8a4c29e2016-07-11 08:49:35 +0000314
Junxiao Shi80f9fcd2016-07-23 02:48:36 +0000315private:
Vince Lehman8a4c29e2016-07-11 08:49:35 +0000316 void
Junxiao Shi80f9fcd2016-07-23 02:48:36 +0000317 extendLifetime(measurements::Entry& me);
Vince Lehman8a4c29e2016-07-11 08:49:35 +0000318
319public:
320 static constexpr time::microseconds MEASUREMENTS_LIFETIME = time::seconds(300);
321
322private:
323 MeasurementsAccessor& m_measurements;
324};
325
326} // namespace asf
327} // namespace fw
328} // namespace nfd
329
330#endif // NFD_DAEMON_FW_ASF_MEASUREMENTS_HPP