fib-manager.cpp
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
26 #include "fib-manager.hpp"
27 #include "fw/face-table.hpp"
28 
29 #include <ndn-cxx/lp/tags.hpp>
30 #include <ndn-cxx/mgmt/nfd/fib-entry.hpp>
31 
32 #include <boost/range/adaptor/transformed.hpp>
33 
34 namespace nfd {
35 
36 NFD_LOG_INIT("FibManager");
37 
39  const FaceTable& faceTable,
40  Dispatcher& dispatcher,
41  CommandAuthenticator& authenticator)
42  : NfdManagerBase(dispatcher, authenticator, "fib")
43  , m_fib(fib)
44  , m_faceTable(faceTable)
45 {
46  registerCommandHandler<ndn::nfd::FibAddNextHopCommand>("add-nexthop",
47  bind(&FibManager::addNextHop, this, _2, _3, _4, _5));
48  registerCommandHandler<ndn::nfd::FibRemoveNextHopCommand>("remove-nexthop",
49  bind(&FibManager::removeNextHop, this, _2, _3, _4, _5));
50 
51  registerStatusDatasetHandler("list", bind(&FibManager::listEntries, this, _1, _2, _3));
52 }
53 
54 void
55 FibManager::addNextHop(const Name& topPrefix, const Interest& interest,
56  ControlParameters parameters,
57  const ndn::mgmt::CommandContinuation& done)
58 {
59  setFaceForSelfRegistration(interest, parameters);
60 
61  const Name& prefix = parameters.getName();
62  FaceId faceId = parameters.getFaceId();
63  uint64_t cost = parameters.getCost();
64 
65  NFD_LOG_TRACE("add-nexthop prefix: " << prefix
66  << " faceid: " << faceId
67  << " cost: " << cost);
68 
69  Face* face = m_faceTable.get(faceId);
70  if (face != nullptr) {
71  fib::Entry* entry = m_fib.insert(prefix).first;
72  entry->addNextHop(*face, cost);
73 
74  NFD_LOG_DEBUG("add-nexthop result: OK"
75  << " prefix:" << prefix
76  << " faceid: " << faceId
77  << " cost: " << cost);
78 
79  return done(ControlResponse(200, "Success").setBody(parameters.wireEncode()));
80  }
81  else {
82  NFD_LOG_INFO("add-nexthop result: FAIL reason: unknown-faceid: " << faceId);
83  return done(ControlResponse(410, "Face not found"));
84  }
85 }
86 
87 void
88 FibManager::removeNextHop(const Name& topPrefix, const Interest& interest,
89  ControlParameters parameters,
90  const ndn::mgmt::CommandContinuation& done)
91 {
92  setFaceForSelfRegistration(interest, parameters);
93 
94  NFD_LOG_TRACE("remove-nexthop prefix: " << parameters.getName()
95  << " faceid: " << parameters.getFaceId());
96 
97  Face* face = m_faceTable.get(parameters.getFaceId());
98  if (face != nullptr) {
99  fib::Entry* entry = m_fib.findExactMatch(parameters.getName());
100  if (entry != nullptr) {
101  entry->removeNextHop(*face);
102  NFD_LOG_DEBUG("remove-nexthop result: OK prefix: " << parameters.getName()
103  << " faceid: " << parameters.getFaceId());
104 
105  if (!entry->hasNextHops()) {
106  m_fib.erase(*entry);
107  }
108  }
109  else {
110  NFD_LOG_DEBUG("remove-nexthop result: OK");
111  }
112  }
113  else {
114  NFD_LOG_DEBUG("remove-nexthop result: OK");
115  }
116 
117  done(ControlResponse(200, "Success").setBody(parameters.wireEncode()));
118 }
119 
120 void
121 FibManager::listEntries(const Name& topPrefix, const Interest& interest,
122  ndn::mgmt::StatusDatasetContext& context)
123 {
124  for (const auto& entry : m_fib) {
125  const auto& nexthops = entry.getNextHops() |
126  boost::adaptors::transformed([] (const fib::NextHop& nh) {
127  return ndn::nfd::NextHopRecord()
128  .setFaceId(nh.getFace().getId())
129  .setCost(nh.getCost());
130  });
131  context.append(ndn::nfd::FibEntry()
132  .setPrefix(entry.getPrefix())
133  .setNextHopRecords(std::begin(nexthops), std::end(nexthops))
134  .wireEncode());
135  }
136  context.end();
137 }
138 
139 void
140 FibManager::setFaceForSelfRegistration(const Interest& request, ControlParameters& parameters)
141 {
142  bool isSelfRegistration = (parameters.getFaceId() == 0);
143  if (isSelfRegistration) {
144  shared_ptr<lp::IncomingFaceIdTag> incomingFaceIdTag = request.getTag<lp::IncomingFaceIdTag>();
145  // NDNLPv2 says "application MUST be prepared to receive a packet without IncomingFaceId field",
146  // but it's fine to assert IncomingFaceId is available, because InternalFace lives inside NFD
147  // and is initialized synchronously with IncomingFaceId field enabled.
148  BOOST_ASSERT(incomingFaceIdTag != nullptr);
149  parameters.setFaceId(*incomingFaceIdTag);
150  }
151 }
152 
153 } // namespace nfd
void registerStatusDatasetHandler(const std::string &verb, const ndn::mgmt::StatusDatasetHandler &handler)
#define NFD_LOG_DEBUG(expression)
Definition: logger.hpp:161
represents a FIB entry
Definition: fib-entry.hpp:51
void addNextHop(Face &face, uint64_t cost)
adds a NextHop record
Definition: fib-entry.cpp:53
container of all faces
Definition: face-table.hpp:37
Face * get(FaceId id) const
get face by FaceId
Definition: face-table.cpp:44
provides ControlCommand authorization according to NFD configuration file
#define NFD_LOG_INFO(expression)
Definition: logger.hpp:162
Copyright (c) 2014-2015, Regents of the University of California, Arizona Board of Regents...
Definition: algorithm.hpp:32
Face & getFace() const
Definition: fib-nexthop.hpp:45
FibManager(Fib &fib, const FaceTable &faceTable, Dispatcher &dispatcher, CommandAuthenticator &authenticator)
Definition: fib-manager.cpp:38
a collection of common functions shared by all NFD managers, such as communicating with the dispatche...
#define NFD_LOG_INIT(name)
Definition: logger.hpp:122
#define NFD_LOG_TRACE(expression)
Definition: logger.hpp:160
uint64_t FaceId
identifies a face
Definition: face.hpp:39
void removeNextHop(const Face &face)
removes a NextHop record
Definition: fib-entry.cpp:66
represents a nexthop record in FIB entry
Definition: fib-nexthop.hpp:38
uint64_t getCost() const
Definition: fib-nexthop.hpp:51
bool hasNextHops() const
Definition: fib-entry.hpp:72