NS-3 based Named Data Networking (NDN) simulator
ndnSIM 2.0: NDN, CCN, CCNx, content centric networks
API Documentation
rib-manager.cpp
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
26 #include "rib-manager.hpp"
27 #include "core/global-io.hpp"
28 #include "core/logger.hpp"
29 #include "core/scheduler.hpp"
30 #include <ndn-cxx/management/nfd-face-status.hpp>
31 
32 namespace nfd {
33 namespace rib {
34 
35 NFD_LOG_INIT("RibManager");
36 
37 const Name RibManager::COMMAND_PREFIX = "/localhost/nfd/rib";
38 const Name RibManager::REMOTE_COMMAND_PREFIX = "/localhop/nfd/rib";
39 const Name RibManager::FACES_LIST_DATASET_PREFIX = "/localhost/nfd/faces/list";
40 
41 const size_t RibManager::COMMAND_UNSIGNED_NCOMPS =
42  RibManager::COMMAND_PREFIX.size() +
43  1 + // verb
44  1; // verb options
45 
46 const size_t RibManager::COMMAND_SIGNED_NCOMPS =
47  RibManager::COMMAND_UNSIGNED_NCOMPS +
48  4; // (timestamp, nonce, signed info tlv, signature tlv)
49 
50 const RibManager::SignedVerbAndProcessor RibManager::SIGNED_COMMAND_VERBS[] =
51  {
52  SignedVerbAndProcessor(
53  Name::Component("register"),
54  &RibManager::registerEntry
55  ),
56 
57  SignedVerbAndProcessor(
58  Name::Component("unregister"),
59  &RibManager::unregisterEntry
60  ),
61  };
62 
63 const RibManager::UnsignedVerbAndProcessor RibManager::UNSIGNED_COMMAND_VERBS[] =
64  {
65  UnsignedVerbAndProcessor(
66  Name::Component("list"),
67  &RibManager::listEntries
68  ),
69  };
70 
71 const Name RibManager::LIST_COMMAND_PREFIX("/localhost/nfd/rib/list");
72 const size_t RibManager::LIST_COMMAND_NCOMPS = LIST_COMMAND_PREFIX.size();
73 
74 const time::seconds RibManager::ACTIVE_FACE_FETCH_INTERVAL = time::seconds(300);
75 
77  : m_face(face)
78  , m_keyChain(keyChain)
79  , m_nfdController(m_face, m_keyChain)
80  , m_localhostValidator(m_face)
81  , m_localhopValidator(m_face)
82  , m_faceMonitor(m_face)
83  , m_isLocalhopEnabled(false)
84  , m_prefixPropagator(m_nfdController, m_keyChain, m_managedRib)
85  , m_ribStatusPublisher(m_managedRib, face, LIST_COMMAND_PREFIX, m_keyChain)
86  , m_fibUpdater(m_managedRib, m_nfdController)
87  , m_signedVerbDispatch(SIGNED_COMMAND_VERBS,
88  SIGNED_COMMAND_VERBS +
89  (sizeof(SIGNED_COMMAND_VERBS) / sizeof(SignedVerbAndProcessor)))
90  , m_unsignedVerbDispatch(UNSIGNED_COMMAND_VERBS,
91  UNSIGNED_COMMAND_VERBS +
92  (sizeof(UNSIGNED_COMMAND_VERBS) / sizeof(UnsignedVerbAndProcessor)))
93 {
94 }
95 
97 {
98  scheduler::cancel(m_activeFaceFetchEvent);
99 }
100 
101 void
102 RibManager::startListening(const Name& commandPrefix, const ndn::OnInterest& onRequest)
103 {
104  NFD_LOG_INFO("Listening on: " << commandPrefix);
105 
106  m_nfdController.start<ndn::nfd::FibAddNextHopCommand>(
108  .setName(commandPrefix)
109  .setFaceId(0),
110  bind(&RibManager::onNrdCommandPrefixAddNextHopSuccess, this, cref(commandPrefix), _1),
111  bind(&RibManager::onNrdCommandPrefixAddNextHopError, this, cref(commandPrefix), _2));
112 
113  m_face.setInterestFilter(commandPrefix, onRequest);
114 }
115 
116 void
118 {
119  //check whether the components of localhop and localhost prefixes are same
120  BOOST_ASSERT(COMMAND_PREFIX.size() == REMOTE_COMMAND_PREFIX.size());
121 
122  this->startListening(COMMAND_PREFIX, bind(&RibManager::onLocalhostRequest, this, _2));
123 
124  if (m_isLocalhopEnabled) {
125  this->startListening(REMOTE_COMMAND_PREFIX,
126  bind(&RibManager::onLocalhopRequest, this, _2));
127  }
128 
129  NFD_LOG_INFO("Start monitoring face create/destroy events");
130  m_faceMonitor.onNotification.connect(bind(&RibManager::onNotification, this, _1));
131  m_faceMonitor.start();
132 
133  scheduleActiveFaceFetch(ACTIVE_FACE_FETCH_INTERVAL);
134 }
135 
136 void
138 {
139  configFile.addSectionHandler("rib",
140  bind(&RibManager::onConfig, this, _1, _2, _3));
141 }
142 
143 void
144 RibManager::onConfig(const ConfigSection& configSection,
145  bool isDryRun,
146  const std::string& filename)
147 {
148  bool isAutoPrefixPropagatorEnabled = false;
149 
150  for (const auto& item : configSection) {
151  if (item.first == "localhost_security") {
152  m_localhostValidator.load(item.second, filename);
153  }
154  else if (item.first == "localhop_security") {
155  m_localhopValidator.load(item.second, filename);
156  m_isLocalhopEnabled = true;
157  }
158  else if (item.first == "auto_prefix_propagate") {
159  m_prefixPropagator.loadConfig(item.second);
160  isAutoPrefixPropagatorEnabled = true;
161 
162  // Avoid other actions when isDryRun == true
163  if (isDryRun) {
164  continue;
165  }
166 
167  m_prefixPropagator.enable();
168  }
169  else {
170  BOOST_THROW_EXCEPTION(Error("Unrecognized rib property: " + item.first));
171  }
172  }
173 
174  if (!isAutoPrefixPropagatorEnabled) {
175  m_prefixPropagator.disable();
176  }
177 }
178 
179 void
180 RibManager::sendResponse(const Name& name,
181  const ControlResponse& response)
182 {
183  const Block& encodedControl = response.wireEncode();
184 
185  shared_ptr<Data> responseData = make_shared<Data>(name);
186  responseData->setContent(encodedControl);
187 
188  m_keyChain.sign(*responseData);
189  m_face.put(*responseData);
190 }
191 
192 void
193 RibManager::sendResponse(const Name& name,
194  uint32_t code,
195  const std::string& text)
196 {
197  ControlResponse response(code, text);
198  sendResponse(name, response);
199 }
200 
201 void
202 RibManager::onLocalhostRequest(const Interest& request)
203 {
204  const Name& command = request.getName();
205  const Name::Component& verb = command.get(COMMAND_PREFIX.size());
206 
207  UnsignedVerbDispatchTable::const_iterator unsignedVerbProcessor = m_unsignedVerbDispatch.find(verb);
208 
209  if (unsignedVerbProcessor != m_unsignedVerbDispatch.end()) {
210  NFD_LOG_DEBUG("command result: processing unsigned verb: " << verb);
211  (unsignedVerbProcessor->second)(this, request);
212  }
213  else {
214  m_localhostValidator.validate(request,
215  bind(&RibManager::onCommandValidated, this, _1),
216  bind(&RibManager::onCommandValidationFailed, this, _1, _2));
217  }
218 }
219 
220 void
221 RibManager::onLocalhopRequest(const Interest& request)
222 {
223  m_localhopValidator.validate(request,
224  bind(&RibManager::onCommandValidated, this, _1),
225  bind(&RibManager::onCommandValidationFailed, this, _1, _2));
226 }
227 
228 void
229 RibManager::onCommandValidated(const shared_ptr<const Interest>& request)
230 {
231  // REMOTE_COMMAND_PREFIX number of componenets are same as
232  // NRD_COMMAND_PREFIX's so no extra checks are required.
233 
234  const Name& command = request->getName();
235  const Name::Component& verb = command[COMMAND_PREFIX.size()];
236  const Name::Component& parameterComponent = command[COMMAND_PREFIX.size() + 1];
237 
238  SignedVerbDispatchTable::const_iterator verbProcessor = m_signedVerbDispatch.find(verb);
239 
240  if (verbProcessor != m_signedVerbDispatch.end()) {
241 
242  ControlParameters parameters;
243  if (!extractParameters(parameterComponent, parameters)) {
244  NFD_LOG_DEBUG("command result: malformed verb: " << verb);
245 
246  if (static_cast<bool>(request)) {
247  sendResponse(command, 400, "Malformed command");
248  }
249 
250  return;
251  }
252 
253  NFD_LOG_DEBUG("command result: processing verb: " << verb);
254  (verbProcessor->second)(this, request, parameters);
255  }
256  else {
257  NFD_LOG_DEBUG("Unsupported command: " << verb);
258 
259  if (static_cast<bool>(request)) {
260  sendResponse(request->getName(), 501, "Unsupported command");
261  }
262  }
263 }
264 
265 void
266 RibManager::registerEntry(const shared_ptr<const Interest>& request,
267  ControlParameters& parameters)
268 {
270 
271  if (!validateParameters(command, parameters)) {
272  NFD_LOG_DEBUG("register result: FAIL reason: malformed");
273 
274  if (static_cast<bool>(request)) {
275  sendResponse(request->getName(), 400, "Malformed command");
276  }
277 
278  return;
279  }
280 
281  bool isSelfRegistration = (!parameters.hasFaceId() || parameters.getFaceId() == 0);
282  if (isSelfRegistration) {
283  shared_ptr<lp::IncomingFaceIdTag> incomingFaceIdTag = request->getTag<lp::IncomingFaceIdTag>();
284  if (incomingFaceIdTag == nullptr) {
285  sendResponse(request->getName(), 503,
286  "requested self-registration, but IncomingFaceId is unavailable");
287  return;
288  }
289  parameters.setFaceId(*incomingFaceIdTag);
290  }
291 
292  // Respond since command is valid and authorized
293  sendSuccessResponse(request, parameters);
294 
295  Route route;
296  route.faceId = parameters.getFaceId();
297  route.origin = parameters.getOrigin();
298  route.cost = parameters.getCost();
299  route.flags = parameters.getFlags();
300 
301  if (parameters.hasExpirationPeriod() &&
302  parameters.getExpirationPeriod() != time::milliseconds::max())
303  {
304  route.expires = time::steady_clock::now() + parameters.getExpirationPeriod();
305 
306  // Schedule a new event, the old one will be cancelled during rib insertion.
308  bind(&Rib::onRouteExpiration, &m_managedRib, parameters.getName(), route));
309 
310  NFD_LOG_TRACE("Scheduled unregistration at: " << route.expires <<
311  " with EventId: " << eventId);
312 
313  // Set the NewEventId of this entry
314  route.setExpirationEvent(eventId);
315  }
316  else {
317  route.expires = time::steady_clock::TimePoint::max();
318  }
319 
320  NFD_LOG_INFO("Adding route " << parameters.getName() << " nexthop=" << route.faceId
321  << " origin=" << route.origin
322  << " cost=" << route.cost);
323 
324  RibUpdate update;
326  .setName(parameters.getName())
327  .setRoute(route);
328 
329  m_managedRib.beginApplyUpdate(update,
330  bind(&RibManager::onRibUpdateSuccess, this, update),
331  bind(&RibManager::onRibUpdateFailure, this, update, _1, _2));
332 
333  m_registeredFaces.insert(route.faceId);
334 }
335 
336 void
337 RibManager::unregisterEntry(const shared_ptr<const Interest>& request,
338  ControlParameters& params)
339 {
341 
342  // Passing all parameters gives error in validation,
343  // so passing only the required arguments.
344  ControlParameters parameters;
345  parameters.setName(params.getName());
346 
347  if (params.hasFaceId()) {
348  parameters.setFaceId(params.getFaceId());
349  }
350 
351  if (params.hasOrigin()) {
352  parameters.setOrigin(params.getOrigin());
353  }
354 
355  if (!validateParameters(command, parameters)) {
356  NFD_LOG_DEBUG("unregister result: FAIL reason: malformed");
357 
358  if (static_cast<bool>(request)) {
359  sendResponse(request->getName(), 400, "Malformed command");
360  }
361 
362  return;
363  }
364 
365  bool isSelfRegistration = (!parameters.hasFaceId() || parameters.getFaceId() == 0);
366  if (isSelfRegistration) {
367  shared_ptr<lp::IncomingFaceIdTag> incomingFaceIdTag = request->getTag<lp::IncomingFaceIdTag>();
368  if (incomingFaceIdTag == nullptr) {
369  sendResponse(request->getName(), 503,
370  "requested self-registration, but IncomingFaceId is unavailable");
371  return;
372  }
373  parameters.setFaceId(*incomingFaceIdTag);
374  }
375 
376  // Respond since command is valid and authorized
377  sendSuccessResponse(request, parameters);
378 
379  Route route;
380  route.faceId = parameters.getFaceId();
381  route.origin = parameters.getOrigin();
382 
383  NFD_LOG_INFO("Removing route " << parameters.getName() << " nexthop=" << route.faceId
384  << " origin=" << route.origin);
385 
386  RibUpdate update;
388  .setName(parameters.getName())
389  .setRoute(route);
390 
391  m_managedRib.beginApplyUpdate(update,
392  bind(&RibManager::onRibUpdateSuccess, this, update),
393  bind(&RibManager::onRibUpdateFailure, this, update, _1, _2));
394 }
395 
396 void
397 RibManager::onCommandValidationFailed(const shared_ptr<const Interest>& request,
398  const std::string& failureInfo)
399 {
400  NFD_LOG_DEBUG("RibRequestValidationFailed: " << failureInfo);
401 
402  if (static_cast<bool>(request)) {
403  sendResponse(request->getName(), 403, failureInfo);
404  }
405 }
406 
407 
408 bool
409 RibManager::extractParameters(const Name::Component& parameterComponent,
410  ControlParameters& extractedParameters)
411 {
412  try {
413  Block rawParameters = parameterComponent.blockFromValue();
414  extractedParameters.wireDecode(rawParameters);
415  }
416  catch (const tlv::Error&) {
417  return false;
418  }
419 
420  NFD_LOG_DEBUG("Parameters parsed OK");
421  return true;
422 }
423 
424 bool
425 RibManager::validateParameters(const ControlCommand& command,
426  ControlParameters& parameters)
427 {
428  try {
429  command.validateRequest(parameters);
430  }
431  catch (const ControlCommand::ArgumentError&) {
432  return false;
433  }
434 
435  command.applyDefaultsToRequest(parameters);
436 
437  return true;
438 }
439 
440 void
441 RibManager::onCommandError(uint32_t code, const std::string& error,
442  const shared_ptr<const Interest>& request,
443  const Route& route)
444 {
445  NFD_LOG_ERROR("NFD returned an error: " << error << " (code: " << code << ")");
446 
447  ControlResponse response;
448 
449  if (code == 404) {
450  response.setCode(code);
451  response.setText(error);
452  }
453  else {
454  response.setCode(533);
455  std::ostringstream os;
456  os << "Failure to update NFD " << "(NFD Error: " << code << " " << error << ")";
457  response.setText(os.str());
458  }
459 
460  if (static_cast<bool>(request)) {
461  sendResponse(request->getName(), response);
462  }
463 }
464 
465 void
466 RibManager::onRegSuccess(const shared_ptr<const Interest>& request,
467  const ControlParameters& parameters,
468  const Route& route)
469 {
470  ControlResponse response;
471 
472  response.setCode(200);
473  response.setText("Success");
474  response.setBody(parameters.wireEncode());
475 
476  NFD_LOG_TRACE("onRegSuccess: registered " << route);
477 
478  if (static_cast<bool>(request)) {
479  sendResponse(request->getName(), response);
480  }
481 }
482 
483 
484 void
485 RibManager::onUnRegSuccess(const shared_ptr<const Interest>& request,
486  const ControlParameters& parameters,
487  const Route& route)
488 {
489  ControlResponse response;
490 
491  response.setCode(200);
492  response.setText("Success");
493  response.setBody(parameters.wireEncode());
494 
495  NFD_LOG_TRACE("onUnRegSuccess: unregistered " << route);
496 
497  if (static_cast<bool>(request)) {
498  sendResponse(request->getName(), response);
499  }
500 }
501 
502 void
503 RibManager::sendSuccessResponse(const shared_ptr<const Interest>& request,
504  const ControlParameters& parameters)
505 {
506  if (!static_cast<bool>(request)) {
507  return;
508  }
509 
510  ControlResponse response;
511 
512  response.setCode(200);
513  response.setText("Success");
514  response.setBody(parameters.wireEncode());
515 
516  if (static_cast<bool>(request)) {
517  sendResponse(request->getName(), response);
518  }
519 }
520 
521 void
522 RibManager::sendErrorResponse(uint32_t code, const std::string& error,
523  const shared_ptr<const Interest>& request)
524 {
525  NFD_LOG_ERROR("NFD returned an error: " << error << " (code: " << code << ")");
526 
527  if (!static_cast<bool>(request)) {
528  return;
529  }
530 
531  ControlResponse response;
532 
533  if (code == 404) {
534  response.setCode(code);
535  response.setText(error);
536  }
537  else {
538  response.setCode(533);
539  std::ostringstream os;
540  os << "Failure to update NFD " << "(NFD Error: " << code << " " << error << ")";
541  response.setText(os.str());
542  }
543 
544  if (static_cast<bool>(request)) {
545  sendResponse(request->getName(), response);
546  }
547 }
548 
549 void
551 {
552  NFD_LOG_DEBUG("RIB update succeeded for " << update);
553 }
554 
555 void
556 RibManager::onRibUpdateFailure(const RibUpdate& update, uint32_t code, const std::string& error)
557 {
558  NFD_LOG_DEBUG("RIB update failed for " << update << " (code: " << code
559  << ", error: " << error << ")");
560 
561  // Since the FIB rejected the update, clean up invalid routes
562  scheduleActiveFaceFetch(time::seconds(1));
563 }
564 
565 void
566 RibManager::onNrdCommandPrefixAddNextHopSuccess(const Name& prefix,
567  const ndn::nfd::ControlParameters& result)
568 {
569  NFD_LOG_DEBUG("Successfully registered " + prefix.toUri() + " with NFD");
570 
571  // Routes must be inserted into the RIB so route flags can be applied
572  Route route;
573  route.faceId = result.getFaceId();
574  route.origin = ndn::nfd::ROUTE_ORIGIN_APP;
575  route.expires = time::steady_clock::TimePoint::max();
577 
578  m_managedRib.insert(prefix, route);
579 
580  m_registeredFaces.insert(route.faceId);
581 }
582 
583 void
584 RibManager::onNrdCommandPrefixAddNextHopError(const Name& name, const std::string& msg)
585 {
586  BOOST_THROW_EXCEPTION(Error("Error in setting interest filter (" + name.toUri() + "): " + msg));
587 }
588 
589 void
590 RibManager::onControlHeaderSuccess()
591 {
592  NFD_LOG_DEBUG("Local control header enabled");
593 }
594 
595 void
596 RibManager::onControlHeaderError(uint32_t code, const std::string& reason)
597 {
598  std::ostringstream os;
599  os << "Couldn't enable local control header "
600  << "(code: " << code << ", info: " << reason << ")";
601  BOOST_THROW_EXCEPTION(Error(os.str()));
602 }
603 
604 void
606 {
609  .setLocalControlFeature(ndn::nfd::LOCAL_CONTROL_FEATURE_INCOMING_FACE_ID),
610  bind(&RibManager::onControlHeaderSuccess, this),
611  bind(&RibManager::onControlHeaderError, this, _1, _2));
612 }
613 
614 void
615 RibManager::onNotification(const FaceEventNotification& notification)
616 {
617  NFD_LOG_TRACE("onNotification: " << notification);
618 
619  if (notification.getKind() == ndn::nfd::FACE_EVENT_DESTROYED) {
620  NFD_LOG_DEBUG("Received notification for destroyed faceId: " << notification.getFaceId());
621 
622  scheduler::schedule(time::seconds(0),
623  bind(&RibManager::onFaceDestroyedEvent, this, notification.getFaceId()));
624  }
625 }
626 
627 void
628 RibManager::onFaceDestroyedEvent(uint64_t faceId)
629 {
630  m_managedRib.beginRemoveFace(faceId);
631  m_registeredFaces.erase(faceId);
632 }
633 
634 void
635 RibManager::listEntries(const Interest& request)
636 {
637  const Name& command = request.getName();
638  const size_t commandNComps = command.size();
639 
640  if (commandNComps < LIST_COMMAND_NCOMPS || !LIST_COMMAND_PREFIX.isPrefixOf(command)) {
641  NFD_LOG_DEBUG("command result: malformed");
642 
643  sendResponse(command, 400, "Malformed command");
644  return;
645  }
646 
647  m_ribStatusPublisher.publish();
648 }
649 
650 void
651 RibManager::scheduleActiveFaceFetch(const time::seconds& timeToWait)
652 {
653  scheduler::cancel(m_activeFaceFetchEvent);
654 
655  m_activeFaceFetchEvent = scheduler::schedule(timeToWait,
656  bind(&RibManager::fetchActiveFaces, this));
657 }
658 
659 void
660 RibManager::fetchActiveFaces()
661 {
662  NFD_LOG_DEBUG("Fetching active faces");
663 
664  Interest interest(FACES_LIST_DATASET_PREFIX);
665  interest.setChildSelector(1);
666  interest.setMustBeFresh(true);
667 
668  shared_ptr<ndn::OBufferStream> buffer = make_shared<ndn::OBufferStream>();
669 
670  m_face.expressInterest(interest,
671  bind(&RibManager::fetchSegments, this, _2, buffer),
672  bind(&RibManager::onFetchFaceStatusTimeout, this));
673 }
674 
675 void
676 RibManager::fetchSegments(const Data& data, shared_ptr<ndn::OBufferStream> buffer)
677 {
678  buffer->write(reinterpret_cast<const char*>(data.getContent().value()),
679  data.getContent().value_size());
680 
681  uint64_t currentSegment = data.getName().get(-1).toSegment();
682 
683  const name::Component& finalBlockId = data.getMetaInfo().getFinalBlockId();
684 
685  if (finalBlockId.empty() || finalBlockId.toSegment() > currentSegment) {
686  m_face.expressInterest(data.getName().getPrefix(-1).appendSegment(currentSegment+1),
687  bind(&RibManager::fetchSegments, this, _2, buffer),
688  bind(&RibManager::onFetchFaceStatusTimeout, this));
689  }
690  else {
691  removeInvalidFaces(buffer);
692  }
693 }
694 
695 void
696 RibManager::removeInvalidFaces(shared_ptr<ndn::OBufferStream> buffer)
697 {
698  NFD_LOG_DEBUG("Checking for invalid face registrations");
699 
700  ndn::ConstBufferPtr buf = buffer->buf();
701 
702  Block block;
703  size_t offset = 0;
704  FaceIdSet activeFaces;
705 
706  while (offset < buf->size()) {
707  bool isOk = false;
708  std::tie(isOk, block) = Block::fromBuffer(buf, offset);
709  if (!isOk) {
710  std::cerr << "ERROR: cannot decode FaceStatus TLV" << std::endl;
711  break;
712  }
713 
714  offset += block.size();
715 
716  ndn::nfd::FaceStatus status(block);
717  activeFaces.insert(status.getFaceId());
718  }
719 
720  // Look for face IDs that were registered but not active to find missed
721  // face destroyed events
722  for (uint64_t faceId : m_registeredFaces) {
723  if (activeFaces.find(faceId) == activeFaces.end()) {
724  NFD_LOG_DEBUG("Removing invalid face ID: " << faceId);
725 
726  scheduler::schedule(time::seconds(0),
727  bind(&RibManager::onFaceDestroyedEvent, this, faceId));
728  }
729  }
730 
731  // Reschedule the check for future clean up
732  scheduleActiveFaceFetch(ACTIVE_FACE_FETCH_INTERVAL);
733 }
734 
735 void
736 RibManager::onFetchFaceStatusTimeout()
737 {
738  std::cerr << "Face Status Dataset request timed out" << std::endl;
739  scheduleActiveFaceFetch(ACTIVE_FACE_FETCH_INTERVAL);
740 }
741 
742 } // namespace rib
743 } // namespace nfd
void start(const ControlParameters &parameters, const CommandSucceedCallback &onSuccess, const CommandFailCallback &onFailure, const CommandOptions &options=CommandOptions())
start command execution
PartialName getPrefix(ssize_t nComponents) const
Extract a prefix (PartialName) of the name, containing first nComponents components.
Definition: name.hpp:249
ControlParameters & setFaceId(uint64_t faceId)
virtual void wireDecode(const Block &wire) final
std::string toUri() const
Encode this name as a URI.
Definition: name.cpp:183
void load(const std::string &filename)
#define NFD_LOG_DEBUG(expression)
Definition: logger.hpp:55
static std::tuple< bool, Block > fromBuffer(ConstBufferPtr buffer, size_t offset)
Try to construct block from Buffer.
Definition: block.cpp:253
represents a fib/add-nexthop command
void setExpirationEvent(const scheduler::EventId eid)
Definition: route.hpp:56
void beginApplyUpdate(const RibUpdate &update, const UpdateSuccessCallback &onSuccess, const UpdateFailureCallback &onFailure)
passes the provided RibUpdateBatch to FibUpdater to calculate and send FibUpdates.
Definition: rib.cpp:338
RibManager(ndn::Face &face, ndn::KeyChain &keyChain)
Definition: rib-manager.cpp:76
Interest & setMustBeFresh(bool mustBeFresh)
Definition: interest.hpp:418
represents parameters in a ControlCommand request or response
time::steady_clock::TimePoint expires
Definition: route.hpp:84
const Block & getContent() const
Get content Block.
Definition: data.cpp:230
void cancel(const EventId &eventId)
cancel a scheduled event
Definition: scheduler.cpp:53
const Component & get(ssize_t i) const
Get the component at the given index.
Definition: name.hpp:419
static time_point now() noexcept
Definition: time.cpp:79
size_t value_size() const
Definition: block.cpp:529
const Name & getName() const
Get name of the Data packet.
Definition: data.hpp:360
size_t wireEncode(EncodingImpl< TAG > &encoder) const
The packet signing interface.
Definition: key-chain.hpp:48
base class of NFD ControlCommand
represents a Face status change notification
uint64_t cost
Definition: route.hpp:83
uint64_t faceId
Definition: route.hpp:80
Class representing a wire element of NDN-TLV packet format.
Definition: block.hpp:43
represents an Interest packet
Definition: interest.hpp:45
virtual void validateRequest(const ControlParameters &parameters) const
validate request parameters
const Block & wireEncode() const
#define NFD_LOG_ERROR(expression)
Definition: logger.hpp:57
void start()
start or resume receiving notifications
function< void(const InterestFilter &, const Interest &)> OnInterest
Callback called when incoming Interest matches the specified InterestFilter.
Definition: face.hpp:94
void sign(Data &data, const SigningInfo &params=DEFAULT_SIGNING_INFO)
Sign data according to the supplied signing information.
Definition: key-chain.cpp:501
void disable()
disable automatic prefix propagation
const uint8_t * value() const
Definition: block.cpp:520
void onRibUpdateSuccess(const RibUpdate &update)
virtual void applyDefaultsToRequest(ControlParameters &parameters) const
apply default values to missing fields in request
signal::Signal< NotificationSubscriber, Notification > onNotification
fires when a Notification is received
provides a tag type for simple types
Definition: tag.hpp:58
std::shared_ptr< ns3::EventId > EventId
Definition: scheduler.hpp:39
represents a faces/enable-local-control command
size_t size() const
Definition: block.cpp:504
void insert(const Name &prefix, const Route &route)
Definition: rib.cpp:84
#define NFD_LOG_INFO(expression)
Definition: logger.hpp:56
void validate(const Data &data, const OnDataValidated &onValidated, const OnDataValidationFailed &onValidationFailed)
Validate Data and call either onValidated or onValidationFailed.
Definition: validator.hpp:82
Copyright (c) 2011-2015 Regents of the University of California.
Definition: ndn-common.hpp:40
void addSectionHandler(const std::string &sectionName, ConfigSectionHandler subscriber)
setup notification of configuration file sections
Definition: config-file.cpp:79
const RegisteredPrefixId * setInterestFilter(const InterestFilter &interestFilter, const OnInterest &onInterest, const RegisterPrefixFailureCallback &onFailure, const security::SigningInfo &signingInfo=security::SigningInfo(), uint64_t flags=nfd::ROUTE_FLAG_CHILD_INHERIT)
Set InterestFilter to dispatch incoming matching interest to onInterest callback and register the fil...
Definition: face.cpp:216
Interest & setChildSelector(int childSelector)
Definition: interest.hpp:404
Name & appendSegment(uint64_t segmentNo)
Append segment number (sequential) using NDN naming conventions.
Definition: name.cpp:232
uint64_t origin
Definition: route.hpp:81
RibUpdate & setAction(Action action)
Definition: rib-update.hpp:81
void loadConfig(const ConfigSection &configSection)
load the "auto_prefix_propagate" section from config file
represents a route for a name prefix
Definition: route.hpp:38
Abstraction to communicate with local or remote NDN forwarder.
Definition: face.hpp:119
const MetaInfo & getMetaInfo() const
Get MetaInfo block from Data packet.
Definition: data.hpp:366
represents Face status
boost::property_tree::ptree ConfigSection
Name abstraction to represent an absolute name.
Definition: name.hpp:46
bool isPrefixOf(const Name &name) const
Check if the N components of this name are the same as the first N components of the given name...
Definition: name.cpp:320
represents a rib/unregister command
void beginRemoveFace(uint64_t faceId)
starts the FIB update process when a face has been destroyed
Definition: rib.cpp:350
represents a rib/register command
size_t size() const
Get the number of components.
Definition: name.hpp:408
ControlResponse & setText(const std::string &text)
const name::Component & getFinalBlockId() const
Definition: meta-info.hpp:214
void enable()
enable automatic prefix propagation
Component holds a read-only name component value.
ControlResponse & setBody(const Block &body)
Block blockFromValue() const
Definition: block.cpp:437
#define NFD_LOG_INIT(name)
Definition: logger.hpp:34
uint64_t flags
Definition: route.hpp:82
uint64_t toSegment() const
Interpret as segment number component using NDN naming conventions.
EventId schedule(const time::nanoseconds &after, const Scheduler::Event &event)
schedule an event
Definition: scheduler.cpp:47
const time::milliseconds & getExpirationPeriod() const
RibUpdate & setName(const Name &name)
Definition: rib-update.hpp:94
ControlParameters & setOrigin(uint64_t origin)
#define NFD_LOG_TRACE(expression)
Definition: logger.hpp:54
ControlParameters & setName(const Name &name)
void onRouteExpiration(const Name &prefix, const Route &route)
Definition: rib.cpp:187
ControlCommand response.
const PendingInterestId * expressInterest(const Interest &interest, const DataCallback &afterSatisfied, const NackCallback &afterNacked, const TimeoutCallback &afterTimeout)
Express Interest.
Definition: face.cpp:117
represents an error in ControlParameters
shared_ptr< const Buffer > ConstBufferPtr
Definition: buffer.hpp:33
uint64_t getFaceId() const
represents a Data packet
Definition: data.hpp:39
void onRibUpdateFailure(const RibUpdate &update, uint32_t code, const std::string &error)
ControlResponse & setCode(uint32_t code)
represents an error in TLV encoding or decoding
Definition: tlv.hpp:50
void put(const Data &data)
Publish data packet.
Definition: face.cpp:171
void setConfigFile(ConfigFile &configFile)
const Name & getName() const
Definition: interest.hpp:218