All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
nfd-forwarder-status.hpp
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
7 #ifndef NDN_MANAGEMENT_NFD_FORWARDER_STATUS_HPP
8 #define NDN_MANAGEMENT_NFD_FORWARDER_STATUS_HPP
9 
10 #include "../encoding/tlv-nfd.hpp"
11 #include "../encoding/encoding-buffer.hpp"
12 
13 namespace ndn {
14 namespace nfd {
15 
20 {
21 public:
22  class Error : public Tlv::Error
23  {
24  public:
25  explicit
26  Error(const std::string& what)
27  : Tlv::Error(what)
28  {
29  }
30  };
31 
33 
34  explicit
35  ForwarderStatus(const Block& payload)
36  {
37  this->wireDecode(payload);
38  }
39 
44  template<bool T>
45  size_t
46  wireEncode(EncodingImpl<T>& encoder) const;
47 
52  const Block&
53  wireEncode() const;
54 
59  void
60  wireDecode(const Block& wire);
61 
62 public: // getters & setters
63  int
64  getNfdVersion() const
65  {
66  return m_nfdVersion;
67  }
68 
70  setNfdVersion(int nfdVersion)
71  {
72  m_wire.reset();
73  m_nfdVersion = nfdVersion;
74  return *this;
75  }
76 
79  {
80  return m_startTimestamp;
81  }
82 
85  {
86  m_wire.reset();
87  m_startTimestamp = startTimestamp;
88  return *this;
89  }
90 
93  {
94  return m_currentTimestamp;
95  }
96 
99  {
100  m_wire.reset();
101  m_currentTimestamp = currentTimestamp;
102  return *this;
103  }
104 
105  size_t
107  {
108  return m_nNameTreeEntries;
109  }
110 
112  setNNameTreeEntries(size_t nNameTreeEntries)
113  {
114  m_wire.reset();
115  m_nNameTreeEntries = nNameTreeEntries;
116  return *this;
117  }
118 
119  size_t
121  {
122  return m_nFibEntries;
123  }
124 
126  setNFibEntries(size_t nFibEntries)
127  {
128  m_wire.reset();
129  m_nFibEntries = nFibEntries;
130  return *this;
131  }
132 
133  size_t
135  {
136  return m_nPitEntries;
137  }
138 
140  setNPitEntries(size_t nPitEntries)
141  {
142  m_wire.reset();
143  m_nPitEntries = nPitEntries;
144  return *this;
145  }
146 
147  size_t
149  {
150  return m_nMeasurementsEntries;
151  }
152 
154  setNMeasurementsEntries(size_t nMeasurementsEntries)
155  {
156  m_wire.reset();
157  m_nMeasurementsEntries = nMeasurementsEntries;
158  return *this;
159  }
160 
161  size_t
163  {
164  return m_nCsEntries;
165  }
166 
168  setNCsEntries(size_t nCsEntries)
169  {
170  m_wire.reset();
171  m_nCsEntries = nCsEntries;
172  return *this;
173  }
174 
175  uint64_t
177  {
178  return m_nInInterests;
179  }
180 
182  setNInInterests(uint64_t nInInterests)
183  {
184  m_wire.reset();
185  m_nInInterests = nInInterests;
186  return *this;
187  }
188 
189  uint64_t
190  getNInDatas() const
191  {
192  return m_nInDatas;
193  }
194 
196  setNInDatas(uint64_t nInDatas)
197  {
198  m_wire.reset();
199  m_nInDatas = nInDatas;
200  return *this;
201  }
202 
203  uint64_t
205  {
206  return m_nOutInterests;
207  }
208 
210  setNOutInterests(uint64_t nOutInterests)
211  {
212  m_wire.reset();
213  m_nOutInterests = nOutInterests;
214  return *this;
215  }
216 
217  uint64_t
218  getNOutDatas() const
219  {
220  return m_nOutDatas;
221  }
222 
224  setNOutDatas(uint64_t nOutDatas)
225  {
226  m_wire.reset();
227  m_nOutDatas = nOutDatas;
228  return *this;
229  }
230 
231 private:
232  int m_nfdVersion;
233  time::system_clock::TimePoint m_startTimestamp;
234  time::system_clock::TimePoint m_currentTimestamp;
235  size_t m_nNameTreeEntries;
236  size_t m_nFibEntries;
237  size_t m_nPitEntries;
238  size_t m_nMeasurementsEntries;
239  size_t m_nCsEntries;
240  uint64_t m_nInInterests;
241  uint64_t m_nInDatas;
242  uint64_t m_nOutInterests;
243  uint64_t m_nOutDatas;
244 
245  mutable Block m_wire;
246 };
247 
248 inline
250  : m_nfdVersion(0)
251  , m_startTimestamp(time::system_clock::TimePoint::min())
252  , m_currentTimestamp(time::system_clock::TimePoint::min())
253  , m_nNameTreeEntries(0)
254  , m_nFibEntries(0)
255  , m_nPitEntries(0)
256  , m_nMeasurementsEntries(0)
257  , m_nCsEntries(0)
258  , m_nInInterests(0)
259  , m_nInDatas(0)
260  , m_nOutInterests(0)
261  , m_nOutDatas(0)
262 {
263 }
264 
265 template<bool T>
266 inline size_t
268 {
269  size_t totalLength = 0;
270 
271  totalLength += prependNonNegativeIntegerBlock(encoder, tlv::nfd::NOutDatas,
272  m_nOutDatas);
274  m_nOutInterests);
275  totalLength += prependNonNegativeIntegerBlock(encoder, tlv::nfd::NInDatas,
276  m_nInDatas);
278  m_nInInterests);
280  m_nCsEntries);
282  m_nMeasurementsEntries);
284  m_nPitEntries);
286  m_nFibEntries);
288  m_nNameTreeEntries);
290  time::toUnixTimestamp(m_currentTimestamp).count());
292  time::toUnixTimestamp(m_startTimestamp).count());
294  m_nfdVersion);
295 
296  totalLength += encoder.prependVarNumber(totalLength);
297  totalLength += encoder.prependVarNumber(Tlv::Content);
298  return totalLength;
299 }
300 
301 inline const Block&
303 {
304  if (m_wire.hasWire())
305  return m_wire;
306 
307  EncodingEstimator estimator;
308  size_t estimatedSize = wireEncode(estimator);
309 
310  EncodingBuffer buffer(estimatedSize, 0);
311  wireEncode(buffer);
312 
313  m_wire = buffer.block();
314  return m_wire;
315 }
316 
317 inline void
319 {
320  if (block.type() != Tlv::Content) {
321  throw Error("expecting Content block for Status payload");
322  }
323  m_wire = block;
324  m_wire.parse();
326 
327  if (val != m_wire.elements_end() && val->type() == tlv::nfd::NfdVersion) {
328  m_nfdVersion = static_cast<int>(readNonNegativeInteger(*val));
329  ++val;
330  }
331  else {
332  throw Error("missing required NfdVersion field");
333  }
334 
335  if (val != m_wire.elements_end() && val->type() == tlv::nfd::StartTimestamp) {
336  m_startTimestamp = time::fromUnixTimestamp(time::milliseconds(readNonNegativeInteger(*val)));
337  ++val;
338  }
339  else {
340  throw Error("missing required StartTimestamp field");
341  }
342 
343  if (val != m_wire.elements_end() && val->type() == tlv::nfd::CurrentTimestamp) {
344  m_currentTimestamp = time::fromUnixTimestamp(time::milliseconds(readNonNegativeInteger(*val)));
345  ++val;
346  }
347  else {
348  throw Error("missing required CurrentTimestamp field");
349  }
350 
351  if (val != m_wire.elements_end() && val->type() == tlv::nfd::NNameTreeEntries) {
352  m_nNameTreeEntries = static_cast<size_t>(readNonNegativeInteger(*val));
353  ++val;
354  }
355  else {
356  throw Error("missing required NNameTreeEntries field");
357  }
358 
359  if (val != m_wire.elements_end() && val->type() == tlv::nfd::NFibEntries) {
360  m_nFibEntries = static_cast<size_t>(readNonNegativeInteger(*val));
361  ++val;
362  }
363  else {
364  throw Error("missing required NFibEntries field");
365  }
366 
367  if (val != m_wire.elements_end() && val->type() == tlv::nfd::NPitEntries) {
368  m_nPitEntries = static_cast<size_t>(readNonNegativeInteger(*val));
369  ++val;
370  }
371  else {
372  throw Error("missing required NPitEntries field");
373  }
374 
375  if (val != m_wire.elements_end() && val->type() == tlv::nfd::NMeasurementsEntries) {
376  m_nMeasurementsEntries = static_cast<size_t>(readNonNegativeInteger(*val));
377  ++val;
378  }
379  else {
380  throw Error("missing required NMeasurementsEntries field");
381  }
382 
383  if (val != m_wire.elements_end() && val->type() == tlv::nfd::NCsEntries) {
384  m_nCsEntries = static_cast<size_t>(readNonNegativeInteger(*val));
385  ++val;
386  }
387  else {
388  throw Error("missing required NCsEntries field");
389  }
390 
391  if (val != m_wire.elements_end() && val->type() == tlv::nfd::NInInterests) {
392  m_nInInterests = static_cast<uint64_t>(readNonNegativeInteger(*val));
393  ++val;
394  }
395  else {
396  throw Error("missing required NInInterests field");
397  }
398 
399  if (val != m_wire.elements_end() && val->type() == tlv::nfd::NInDatas) {
400  m_nInDatas = static_cast<uint64_t>(readNonNegativeInteger(*val));
401  ++val;
402  }
403  else {
404  throw Error("missing required NInDatas field");
405  }
406 
407  if (val != m_wire.elements_end() && val->type() == tlv::nfd::NOutInterests) {
408  m_nOutInterests = static_cast<uint64_t>(readNonNegativeInteger(*val));
409  ++val;
410  }
411  else {
412  throw Error("missing required NOutInterests field");
413  }
414 
415  if (val != m_wire.elements_end() && val->type() == tlv::nfd::NOutDatas) {
416  m_nOutDatas = static_cast<uint64_t>(readNonNegativeInteger(*val));
417  ++val;
418  }
419  else {
420  throw Error("missing required NOutDatas field");
421  }
422 }
423 
424 } // namespace nfd
425 } // namespace ndn
426 
427 #endif // NDN_MANAGEMENT_NFD_FORWARDER_STATUS_HPP
ForwarderStatus & setNNameTreeEntries(size_t nNameTreeEntries)
represents NFD Forwarder Status
const time::system_clock::TimePoint & getStartTimestamp() const
ForwarderStatus & setNOutInterests(uint64_t nOutInterests)
Class representing wire element of the NDN packet.
Definition: block.hpp:26
ForwarderStatus & setNFibEntries(size_t nFibEntries)
uint64_t readNonNegativeInteger(const Block &block)
ForwarderStatus & setStartTimestamp(const time::system_clock::TimePoint &startTimestamp)
ForwarderStatus & setNInDatas(uint64_t nInDatas)
element_const_iterator elements_end() const
Definition: block.hpp:476
element_const_iterator elements_begin() const
Definition: block.hpp:470
ForwarderStatus & setNfdVersion(int nfdVersion)
ForwarderStatus & setCurrentTimestamp(const time::system_clock::TimePoint &currentTimestamp)
element_container::const_iterator element_const_iterator
Definition: block.hpp:31
ForwarderStatus & setNPitEntries(size_t nPitEntries)
ForwarderStatus & setNOutDatas(uint64_t nOutDatas)
void reset()
Reset wire buffer of the element.
Definition: block.hpp:300
ForwarderStatus & setNMeasurementsEntries(size_t nMeasurementsEntries)
const Block & wireEncode() const
encode ForwarderStatus as a Content block
void parse() const
Parse wire buffer into subblocks.
Definition: block.cpp:265
uint32_t type() const
Definition: block.hpp:320
time_point TimePoint
Definition: time.hpp:55
system_clock::TimePoint fromUnixTimestamp(const milliseconds &duration)
Convert UNIX timestamp to system_clock::TimePoint.
Definition: time.hpp:116
milliseconds toUnixTimestamp(const system_clock::TimePoint &point)
Convert system_clock::TimePoint to UNIX timestamp.
Definition: time.hpp:107
void wireDecode(const Block &wire)
decode ForwarderStatus from a Content block
bool hasWire() const
Check if the Block has fully encoded wire.
Definition: block.hpp:288
ForwarderStatus(const Block &payload)
size_t prependNonNegativeIntegerBlock(EncodingImpl< P > &encoder, uint32_t type, uint64_t number)
helper methods
ForwarderStatus & setNCsEntries(size_t nCsEntries)
const time::system_clock::TimePoint & getCurrentTimestamp() const
ForwarderStatus & setNInInterests(uint64_t nInInterests)
Class representing wire element of the NDN packet.