asf-measurements.hpp
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
26 #ifndef NFD_DAEMON_FW_ASF_MEASUREMENTS_HPP
27 #define NFD_DAEMON_FW_ASF_MEASUREMENTS_HPP
28 
29 #include "core/rtt-estimator.hpp"
30 #include "fw/strategy-info.hpp"
32 
33 namespace nfd {
34 namespace fw {
35 namespace asf {
36 
37 class RttStats
38 {
39 public:
40  typedef time::duration<double, boost::micro> Rtt;
41 
42  RttStats();
43 
44  void
46 
47  void
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 
66  computeRto() const
67  {
68  return m_rttEstimator.computeRto();
69  }
70 
71 private:
72  static Rtt
73  computeSrtt(Rtt previousSrtt, Rtt currentRtt);
74 
75 public:
76  static const Rtt RTT_TIMEOUT;
77  static const Rtt RTT_NO_MEASUREMENT;
78 
79 private:
80  Rtt m_srtt;
81  Rtt m_rtt;
82  RttEstimator m_rttEstimator;
83 
84  static const double ALPHA;
85 };
86 
89 
92 class FaceInfo
93 {
94 public:
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
110  setTimeoutEvent(const scheduler::EventId& id, const Name& interestName);
111 
112  void
113  setMeasurementExpirationEventId(const scheduler::EventId& id)
114  {
115  m_measurementExpirationId = id;
116  }
117 
118  const scheduler::EventId&
120  {
121  return m_measurementExpirationId;
122  }
123 
124  void
125  cancelTimeoutEvent(const Name& prefix);
126 
127  bool
129  {
130  return m_isTimeoutScheduled;
131  }
132 
133  void
134  recordRtt(const shared_ptr<pit::Entry>& pitEntry, const Face& inFace);
135 
136  void
137  recordTimeout(const Name& interestName);
138 
139  bool
140  isTimeout() const
141  {
142  return getRtt() == RttStats::RTT_TIMEOUT;
143  }
144 
146  computeRto() const
147  {
148  return m_rttStats.computeRto();
149  }
150 
152  getRtt() const
153  {
154  return m_rttStats.getRtt();
155  }
156 
158  getSrtt() const
159  {
160  return m_rttStats.getSrtt();
161  }
162 
163  bool
165  {
167  }
168 
169 private:
170  void
171  cancelTimeoutEvent();
172 
173  bool
174  doesNameMatchLastInterest(const Name& name);
175 
176 private:
177  RttStats m_rttStats;
178  Name m_lastInterestName;
179 
180  // Timeout associated with measurement
181  scheduler::EventId m_measurementExpirationId;
182 
183  // RTO associated with Interest
184  scheduler::EventId m_timeoutEventId;
185  bool m_isTimeoutScheduled;
186 };
187 
188 typedef std::unordered_map<face::FaceId, FaceInfo> FaceInfoTable;
189 
192 
196 {
197 public:
198  NamespaceInfo();
199 
200  static constexpr int
202  {
203  return 1030;
204  }
205 
206  FaceInfo&
207  getOrCreateFaceInfo(const fib::Entry& fibEntry, const Face& face);
208 
209  FaceInfo*
210  getFaceInfo(const fib::Entry& fibEntry, const Face& face);
211 
212  void
213  expireFaceInfo(nfd::face::FaceId faceId);
214 
215  void
216  extendFaceInfoLifetime(FaceInfo& info, const Face& face);
217 
218  FaceInfo*
219  get(nfd::face::FaceId faceId)
220  {
221  if (m_fit.find(faceId) != m_fit.end()) {
222  return &m_fit.at(faceId);
223  }
224  else {
225  return nullptr;
226  }
227  }
228 
231  {
232  return m_fit.find(faceId);
233  }
234 
236  end()
237  {
238  return m_fit.end();
239  }
240 
243  {
244  const auto& pair = m_fit.insert(std::make_pair(faceId, FaceInfo()));
245  return pair.first;
246  }
247 
248  bool
249  isProbingDue() const
250  {
251  return m_isProbingDue;
252  }
253 
254  void
255  setIsProbingDue(bool isProbingDue)
256  {
257  m_isProbingDue = isProbingDue;
258  }
259 
260  bool
262  {
263  return m_hasFirstProbeBeenScheduled;
264  }
265 
266  void
267  setHasFirstProbeBeenScheduled(bool hasBeenScheduled)
268  {
269  m_hasFirstProbeBeenScheduled = hasBeenScheduled;
270  }
271 
272 private:
273  FaceInfoTable m_fit;
274 
275  bool m_isProbingDue;
276  bool m_hasFirstProbeBeenScheduled;
277 };
278 
281 
284 class AsfMeasurements : noncopyable
285 {
286 public:
287  explicit
288  AsfMeasurements(MeasurementsAccessor& measurements);
289 
290  FaceInfo*
291  getFaceInfo(const fib::Entry& fibEntry, const Interest& interest, const Face& face);
292 
293  FaceInfo&
294  getOrCreateFaceInfo(const fib::Entry& fibEntry, const Interest& interest, const Face& face);
295 
297  getNamespaceInfo(const Name& prefix);
298 
300  getOrCreateNamespaceInfo(const fib::Entry& fibEntry, const Interest& interest);
301 
302 private:
303  void
304  extendLifetime(measurements::Entry& me);
305 
306 public:
307  static constexpr time::microseconds MEASUREMENTS_LIFETIME = time::seconds(300);
308 
309 private:
310  MeasurementsAccessor& m_measurements;
311 };
312 
313 } // namespace asf
314 } // namespace fw
315 } // namespace nfd
316 
317 #endif // NFD_DAEMON_FW_ASF_MEASUREMENTS_HPP
const FaceInfoTable::iterator insert(nfd::face::FaceId faceId)
RttStats::Rtt getRtt() const
represents a Measurements entry
bool hasSrttMeasurement() const
time::microseconds Duration
represents a FIB entry
Definition: fib-entry.hpp:51
void addRttMeasurement(RttEstimator::Duration &durationRtt)
implements the Mean-Deviation RTT estimator
STL namespace.
RttStats::Rtt getSrtt() const
time::duration< double, boost::micro > Rtt
FaceInfoTable::iterator end()
void setIsProbingDue(bool isProbingDue)
Table::const_iterator iterator
Definition: cs-internal.hpp:41
Copyright (c) 2014-2015, Regents of the University of California, Arizona Board of Regents...
Definition: algorithm.hpp:32
contains arbitrary information forwarding strategy places on table entries
void setHasFirstProbeBeenScheduled(bool hasBeenScheduled)
Error(const std::string &what)
const scheduler::EventId & getMeasurementExpirationEventId()
bool isTimeoutScheduled() const
stores stategy information about each face in this namespace
static const Rtt RTT_TIMEOUT
static constexpr int getTypeId()
uint64_t FaceId
identifies a face
Definition: face.hpp:39
RttEstimator::Duration computeRto() const
RttEstimator::Duration computeRto() const
Duration computeRto() const
void setMeasurementExpirationEventId(const scheduler::EventId &id)
FaceInfoTable::iterator find(nfd::face::FaceId faceId)
Strategy information for each face in a namespace.
Helper class to retrieve and create strategy measurements.
std::unordered_map< face::FaceId, FaceInfo > FaceInfoTable
static const Rtt RTT_NO_MEASUREMENT