31 #include <boost/logic/tribool.hpp> 33 #include <ndn-cxx/lp/tags.hpp> 34 #include <ndn-cxx/mgmt/nfd/channel-status.hpp> 43 , m_faceSystem(faceSystem)
44 , m_faceTable(faceSystem.getFaceTable())
47 registerCommandHandler<ndn::nfd::FaceCreateCommand>(
"create",
48 bind(&FaceManager::createFace,
this, _2, _3, _4, _5));
50 registerCommandHandler<ndn::nfd::FaceUpdateCommand>(
"update",
51 bind(&FaceManager::updateFace,
this, _2, _3, _4, _5));
53 registerCommandHandler<ndn::nfd::FaceDestroyCommand>(
"destroy",
54 bind(&FaceManager::destroyFace,
this, _2, _3, _4, _5));
64 connectFaceStateChangeSignal(
face);
79 FaceManager::createFace(
const Name& topPrefix,
const Interest& interest,
106 if (!localUri->isCanonical()) {
107 NFD_LOG_TRACE(
"received non-canonical local URI: " << localUri->toString());
114 if (factory ==
nullptr) {
120 face::FaceParams faceParams;
136 factory->createFace({remoteUri, localUri, faceParams},
137 bind(&FaceManager::afterCreateFaceSuccess,
this, parameters, _1, done),
138 bind(&FaceManager::afterCreateFaceFailure,
this, _1, _2, done));
140 catch (
const std::runtime_error& error) {
142 done(
ControlResponse(500,
"Face creation failed due to internal error"));
145 catch (
const std::logic_error& error) {
147 done(
ControlResponse(500,
"Face creation failed due to internal error"));
154 const shared_ptr<Face>&
face,
161 done(
ControlResponse(409,
"Face with remote URI already exists").setBody(response.wireEncode()));
179 FaceManager::afterCreateFaceFailure(uint32_t status,
180 const std::string& reason,
189 FaceManager::updateFace(
const Name& topPrefix,
const Interest& interest,
193 FaceId faceId = parameters.getFaceId();
197 if (incomingFaceIdTag ==
nullptr) {
199 done(
ControlResponse(404,
"No FaceId specified and IncomingFaceId not available"));
202 faceId = *incomingFaceIdTag;
207 if (
face ==
nullptr) {
215 bool areParamsValid =
true;
220 NFD_LOG_TRACE(
"received request to enable local fields on non-local face");
221 areParamsValid =
false;
227 if (parameters.hasFacePersistency()) {
228 auto persistency = parameters.getFacePersistency();
229 if (!
face->getTransport()->canChangePersistencyTo(persistency)) {
230 NFD_LOG_TRACE(
"cannot change face persistency to " << persistency);
231 areParamsValid =
false;
232 response.setFacePersistency(persistency);
236 if (!areParamsValid) {
237 done(
ControlResponse(409,
"Invalid properties specified").setBody(response.wireEncode()));
242 if (parameters.hasFacePersistency()) {
243 face->setPersistency(parameters.getFacePersistency());
245 setLinkServiceOptions(*
face, parameters);
248 response = collectFaceProperties(*
face,
false);
254 FaceManager::destroyFace(
const Name& topPrefix,
const Interest& interest,
258 Face*
face = m_faceTable.
get(parameters.getFaceId());
259 if (
face !=
nullptr) {
267 FaceManager::setLinkServiceOptions(
Face&
face,
271 BOOST_ASSERT(linkService !=
nullptr);
273 auto options = linkService->getOptions();
284 if (parameters.hasBaseCongestionMarkingInterval()) {
285 options.baseCongestionMarkingInterval = parameters.getBaseCongestionMarkingInterval();
287 if (parameters.hasDefaultCongestionThreshold()) {
288 options.defaultCongestionThreshold = parameters.getDefaultCongestionThreshold();
290 linkService->setOptions(options);
294 FaceManager::collectFaceProperties(
const Face&
face,
bool wantUris)
297 BOOST_ASSERT(linkService !=
nullptr);
298 auto options = linkService->getOptions();
301 params.setFaceId(
face.getId())
302 .setFacePersistency(
face.getPersistency())
303 .setBaseCongestionMarkingInterval(options.baseCongestionMarkingInterval)
304 .setDefaultCongestionThreshold(options.defaultCongestionThreshold)
309 params.setUri(
face.getRemoteUri().toString())
310 .setLocalUri(
face.getLocalUri().toString());
316 FaceManager::listFaces(
const Name& topPrefix,
const Interest& interest,
320 for (
const Face&
face : m_faceTable) {
328 FaceManager::listChannels(
const Name& topPrefix,
const Interest& interest,
332 for (
const auto* factory : factories) {
333 for (
const auto& channel : factory->getChannels()) {
343 FaceManager::queryFaces(
const Name& topPrefix,
const Interest& interest,
347 const Name& query = interest.getName();
349 faceFilter.
wireDecode(query[-1].blockFromValue());
351 catch (
const tlv::Error& e) {
357 for (
const Face&
face : m_faceTable) {
358 if (!matchFilter(faceFilter,
face)) {
415 collectFaceProperties(
face, status);
418 if (expirationTime != time::steady_clock::TimePoint::max()) {
420 time::duration_cast<time::milliseconds>(expirationTime - now)));
425 if (linkService !=
nullptr) {
426 auto linkServiceOptions = linkService->getOptions();
431 const face::FaceCounters& counters =
face.getCounters();
444 template<
typename FaceTraits>
446 FaceManager::collectFaceProperties(
const Face&
face, FaceTraits& traits)
449 .setRemoteUri(
face.getRemoteUri().toString())
450 .setLocalUri(
face.getLocalUri().toString())
451 .setFaceScope(
face.getScope())
452 .setFacePersistency(
face.getPersistency())
453 .setLinkType(
face.getLinkType());
457 if (linkService !=
nullptr) {
458 auto linkServiceOptions = linkService->getOptions();
461 linkServiceOptions.reliabilityOptions.isEnabled);
463 linkServiceOptions.allowCongestionMarking);
472 collectFaceProperties(
face, notification);
474 m_postNotification(notification.
wireEncode());
478 FaceManager::connectFaceStateChangeSignal(
const Face&
face)
481 m_faceStateChangeConn[faceId] =
face.afterStateChange.connect(
483 const Face&
face = *m_faceTable.get(faceId);
492 m_faceStateChangeConn.erase(faceId);
signal::Signal< FaceTable, Face & > afterAdd
fires after a face is added
LinkType getLinkType() const
bool hasFaceScope() const
void reject(const ControlResponse &resp=ControlResponse().setCode(400))
declare the non-existence of a response
void setConfigFile(ConfigFile &configFile)
Subscribe to face_system section for the config file.
const std::string & getLocalUri() const
represents parameters in a ControlCommand request or response
time::nanoseconds getBaseCongestionMarkingInterval() const
generalization of a network interface
represents a dispatcher on server side of NFD Management protocol
static time_point now() noexcept
configuration file parsing utility
FaceScope getFaceScope() const
std::string toString() const
write as a string
void add(shared_ptr< Face > face)
add a face
ProtocolFactory * getFactoryByScheme(const std::string &scheme)
entry point of the face system
signal::Signal< FaceTable, Face & > beforeRemove
fires before a face is removed
represents a Face status change notification
whether congestion detection and marking is enabled on a face
const std::string & getRemoteUri() const
represents an Interest packet
#define NFD_LOG_DEBUG(expression)
FaceEventNotification & setKind(FaceEventKind kind)
std::set< const ProtocolFactory * > listProtocolFactories() const
bool hasRemoteUri() const
FaceStatus & setNOutBytes(uint64_t nOutBytes)
FaceStatus & setNOutInterests(uint64_t nOutInterests)
C & setFaceId(uint64_t faceId)
bool hasBaseCongestionMarkingInterval() const
Face * get(FaceId id) const
get face by FaceId
FaceStatus & setExpirationPeriod(time::milliseconds expirationPeriod)
provides a tag type for simple types
FaceStatus & setNInInterests(uint64_t nInInterests)
FacePersistency getFacePersistency() const
FaceStatus & setNInBytes(uint64_t nInBytes)
#define NFD_LOG_TRACE(expression)
#define NFD_LOG_ERROR(expression)
size_t wireEncode(EncodingImpl< TAG > &encoder) const
prepend FaceEventNotification to the encoder
bool hasUriScheme() const
mgmt::ControlResponse ControlResponse
whether the link reliability feature is enabled on a face
FaceStatus & setNInNacks(uint64_t nInNacks)
Copyright (c) 2011-2015 Regents of the University of California.
FaceManager(FaceSystem &faceSystem, Dispatcher &dispatcher, CommandAuthenticator &authenticator)
TransportState FaceState
indicates the state of a face
bool parse(const std::string &uri)
exception-safe parsing
uint64_t getFaceId() const
FaceStatus & setNOutData(uint64_t nOutData)
const std::string & getLocalUri() const
void end()
end the response successfully after appending zero or more blocks
the transport is closed, and can be safely deallocated
face went UP (from DOWN state)
void setConfigFile(ConfigFile &configFile)
register handler for face_system section of NFD configuration file
uint64_t getDefaultCongestionThreshold() const
get default congestion threshold (measured in bytes)
size_t wireEncode(EncodingImpl< TAG > &encoder) const
prepend FaceStatus to the encoder
represents an item in NFD Face dataset
Represents an absolute name.
represents the underlying protocol and address used by a Face
bool hasFlagBit(size_t bit) const
std::function< void(const ControlResponse &resp)> CommandContinuation
a function to be called after ControlCommandHandler completes
represents Face Query Filter
const std::string & getUri() const
const std::string & getScheme() const
get scheme (protocol)
FaceStatus & setBaseCongestionMarkingInterval(time::nanoseconds interval)
provides ControlCommand authorization according to NFD configuration file
FaceStatus & setNOutNacks(uint64_t nOutNacks)
bool hasDefaultCongestionThreshold() const
void append(const Block &block)
append a Block to the response
represents an item in NFD Channel dataset
bool getFlagBit(size_t bit) const
FaceStatus & setNInData(uint64_t nInData)
ndn::mgmt::PostNotification registerNotificationStream(const std::string &verb)
the transport is up and can transmit packets
const std::string & getUriScheme() const
provides a context for generating response to a StatusDataset request
FacePersistency getFacePersistency() const
uint64_t FaceId
identifies a face
bool isCanonical() const
determine whether this FaceUri is in canonical form
a collection of common functions shared by all NFD managers, such as communicating with the dispatche...
#define NFD_LOG_INIT(name)
bool hasFacePersistency() const
whether local fields are enabled on a face
void wireDecode(const Block &wire)
decode FaceQueryFilter
void registerStatusDatasetHandler(const std::string &verb, const ndn::mgmt::StatusDatasetHandler &handler)
const FaceId INVALID_FACEID
indicates an invalid FaceId
face went DOWN (from UP state)
FaceStatus & setDefaultCongestionThreshold(uint64_t threshold)
set default congestion threshold (measured in bytes)
the transport is temporarily down, and is being recovered
size_t wireEncode(EncodingImpl< TAG > &encoder) const
ChannelStatus & setLocalUri(const std::string localUri)