28 #include <ndn-cxx/lp/tags.hpp>
29 #include <ndn-cxx/mgmt/nfd/fib-entry.hpp>
37 Dispatcher& dispatcher,
41 , m_faceTable(faceTable)
43 registerCommandHandler<ndn::nfd::FibAddNextHopCommand>(
"add-nexthop",
44 bind(&FibManager::addNextHop,
this, _2, _3, _4, _5));
45 registerCommandHandler<ndn::nfd::FibRemoveNextHopCommand>(
"remove-nexthop",
46 bind(&FibManager::removeNextHop,
this, _2, _3, _4, _5));
52 FibManager::addNextHop(
const Name& topPrefix,
const Interest& interest,
53 ControlParameters parameters,
54 const ndn::mgmt::CommandContinuation& done)
56 setFaceForSelfRegistration(interest, parameters);
58 const Name& prefix = parameters.getName();
59 FaceId faceId = parameters.getFaceId();
60 uint64_t cost = parameters.getCost();
63 <<
" faceid: " << faceId
64 <<
" cost: " << cost);
66 Face* face = m_faceTable.
get(faceId);
67 if (face !=
nullptr) {
68 fib::Entry* entry = m_fib.insert(prefix).first;
72 <<
" prefix:" << prefix
73 <<
" faceid: " << faceId
74 <<
" cost: " << cost);
76 return done(ControlResponse(200,
"Success").setBody(parameters.wireEncode()));
79 NFD_LOG_INFO(
"add-nexthop result: FAIL reason: unknown-faceid: " << faceId);
80 return done(ControlResponse(410,
"Face not found"));
85 FibManager::removeNextHop(
const Name& topPrefix,
const Interest& interest,
86 ControlParameters parameters,
87 const ndn::mgmt::CommandContinuation& done)
89 setFaceForSelfRegistration(interest, parameters);
91 NFD_LOG_TRACE(
"remove-nexthop prefix: " << parameters.getName()
92 <<
" faceid: " << parameters.getFaceId());
94 Face* face = m_faceTable.
get(parameters.getFaceId());
95 if (face !=
nullptr) {
96 fib::Entry* entry = m_fib.findExactMatch(parameters.getName());
97 if (entry !=
nullptr) {
98 entry->removeNextHop(*face);
99 NFD_LOG_DEBUG(
"remove-nexthop result: OK prefix: " << parameters.getName()
100 <<
" faceid: " << parameters.getFaceId());
102 if (!entry->hasNextHops()) {
114 done(ControlResponse(200,
"Success").setBody(parameters.wireEncode()));
118 FibManager::listEntries(
const Name& topPrefix,
const Interest& interest,
119 ndn::mgmt::StatusDatasetContext& context)
121 for (
auto&& entry : m_fib) {
122 auto prefix = entry.getPrefix();
123 ndn::nfd::FibEntry record;
124 const auto& nextHops = entry.getNextHops();
126 for (
auto&& next : nextHops) {
127 ndn::nfd::NextHopRecord nextHopRecord;
128 nextHopRecord.setFaceId(next.getFace().getId());
129 nextHopRecord.setCost(next.getCost());
131 record.addNextHopRecord(nextHopRecord);
134 record.setPrefix(prefix);
135 context.append(record.wireEncode());
142 FibManager::setFaceForSelfRegistration(
const Interest& request, ControlParameters& parameters)
144 bool isSelfRegistration = (parameters.getFaceId() == 0);
145 if (isSelfRegistration) {
146 shared_ptr<lp::IncomingFaceIdTag> incomingFaceIdTag = request.getTag<lp::IncomingFaceIdTag>();
150 BOOST_ASSERT(incomingFaceIdTag !=
nullptr);
151 parameters.setFaceId(*incomingFaceIdTag);
void registerStatusDatasetHandler(const std::string &verb, const ndn::mgmt::StatusDatasetHandler &handler)
#define NFD_LOG_DEBUG(expression)
void addNextHop(Face &face, uint64_t cost)
adds a NextHop record
Face * get(FaceId id) const
get face by FaceId
provides ControlCommand authorization according to NFD configuration file
#define NFD_LOG_INFO(expression)
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)
#define NFD_LOG_TRACE(expression)
uint64_t FaceId
identifies a face