31 #include <ndn-cxx/lp/tags.hpp> 32 #include <ndn-cxx/mgmt/nfd/fib-entry.hpp> 34 #include <boost/range/adaptor/transformed.hpp> 42 Dispatcher& dispatcher,
46 , m_faceTable(faceTable)
48 registerCommandHandler<ndn::nfd::FibAddNextHopCommand>(
"add-nexthop",
49 bind(&FibManager::addNextHop,
this, _2, _3, _4, _5));
50 registerCommandHandler<ndn::nfd::FibRemoveNextHopCommand>(
"remove-nexthop",
51 bind(&FibManager::removeNextHop,
this, _2, _3, _4, _5));
57 FibManager::addNextHop(
const Name& topPrefix,
const Interest& interest,
58 ControlParameters parameters,
59 const ndn::mgmt::CommandContinuation& done)
61 setFaceForSelfRegistration(interest, parameters);
62 const Name& prefix = parameters.getName();
63 FaceId faceId = parameters.getFaceId();
64 uint64_t cost = parameters.getCost();
66 if (prefix.size() > Fib::getMaxDepth()) {
67 NFD_LOG_DEBUG(
"fib/add-nexthop(" << prefix <<
',' << faceId <<
',' << cost <<
68 "): FAIL prefix-too-long");
69 return done(ControlResponse(414,
"FIB entry prefix cannot exceed " +
70 ndn::to_string(Fib::getMaxDepth()) +
" components"));
73 Face* face = m_faceTable.
get(faceId);
74 if (face ==
nullptr) {
75 NFD_LOG_DEBUG(
"fib/add-nexthop(" << prefix <<
',' << faceId <<
',' << cost <<
76 "): FAIL unknown-faceid");
77 return done(ControlResponse(410,
"Face not found"));
80 fib::Entry* entry = m_fib.insert(prefix).first;
83 NFD_LOG_TRACE(
"fib/add-nexthop(" << prefix <<
',' << faceId <<
',' << cost <<
"): OK");
84 return done(ControlResponse(200,
"Success").setBody(parameters.wireEncode()));
88 FibManager::removeNextHop(
const Name& topPrefix,
const Interest& interest,
89 ControlParameters parameters,
90 const ndn::mgmt::CommandContinuation& done)
92 setFaceForSelfRegistration(interest, parameters);
93 const Name& prefix = parameters.getName();
94 FaceId faceId = parameters.getFaceId();
96 done(ControlResponse(200,
"Success").setBody(parameters.wireEncode()));
98 Face* face = m_faceTable.
get(faceId);
99 if (face ==
nullptr) {
100 NFD_LOG_TRACE(
"fib/remove-nexthop(" << prefix <<
',' << faceId <<
"): OK no-face");
104 fib::Entry* entry = m_fib.findExactMatch(parameters.getName());
105 if (entry ==
nullptr) {
106 NFD_LOG_TRACE(
"fib/remove-nexthop(" << prefix <<
',' << faceId <<
"): OK no-entry");
113 NFD_LOG_TRACE(
"fib/remove-nexthop(" << prefix <<
',' << faceId <<
"): OK entry-erased");
116 NFD_LOG_TRACE(
"fib/remove-nexthop(" << prefix <<
',' << faceId <<
"): OK nexthop-removed");
121 FibManager::listEntries(
const Name& topPrefix,
const Interest& interest,
122 ndn::mgmt::StatusDatasetContext& context)
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())
131 context.append(ndn::nfd::FibEntry()
132 .setPrefix(entry.getPrefix())
133 .setNextHopRecords(std::begin(nexthops), std::end(nexthops))
140 FibManager::setFaceForSelfRegistration(
const Interest& request, ControlParameters& parameters)
142 bool isSelfRegistration = (parameters.getFaceId() == 0);
143 if (isSelfRegistration) {
144 shared_ptr<lp::IncomingFaceIdTag> incomingFaceIdTag = request.getTag<lp::IncomingFaceIdTag>();
148 BOOST_ASSERT(incomingFaceIdTag !=
nullptr);
149 parameters.setFaceId(*incomingFaceIdTag);
void registerStatusDatasetHandler(const std::string &verb, const ndn::mgmt::StatusDatasetHandler &handler)
void addOrUpdateNextHop(Face &face, uint64_t endpointId, uint64_t cost)
adds a NextHop record
Face * get(FaceId id) const
get face by FaceId
Provides ControlCommand authorization according to NFD configuration file.
Copyright (c) 2014-2015, Regents of the University of California, Arizona Board of Regents...
FibManager(Fib &fib, const FaceTable &faceTable, Dispatcher &dispatcher, CommandAuthenticator &authenticator)
a collection of common functions shared by all NFD managers, such as communicating with the dispatche...
#define NFD_LOG_INIT(name)
void removeNextHop(const Face &face, uint64_t endpointId)
removes the NextHop record for face with the given endpointId
uint64_t FaceId
identifies a face
represents a nexthop record in FIB entry