face: LpFace counters
FaceCounters for LpFace consist of LinkService::Counters and
Transport::Counters. Old FaceCounters class from 2014 face architecture is
renamed as OldFaceCounters, and can be wrapped with new FaceCounters class.
OldFaceCounters is only used in old Face subclasses.
This commit also updates existing face test suites to use new FaceCounters,
updates ForwarderStatus so that it does not rely on FaceCounters,
and moves the logic of copying face properties and counters into management
structs from face system into FaceManager.
refs #3177
Change-Id: I587e8a32fa72bac3af9d750b2c88342740aa08d6
diff --git a/daemon/mgmt/face-manager.cpp b/daemon/mgmt/face-manager.cpp
index 6413334..1b68a3d 100644
--- a/daemon/mgmt/face-manager.cpp
+++ b/daemon/mgmt/face-manager.cpp
@@ -269,7 +269,10 @@
ndn::mgmt::StatusDatasetContext& context)
{
for (const auto& face : m_faceTable) {
- context.append(face->getFaceStatus().wireEncode());
+ ndn::nfd::FaceStatus status;
+ collectFaceProperties(*face, status);
+ collectFaceCounters(*face, status);
+ context.append(status.wireEncode());
}
context.end();
}
@@ -312,9 +315,13 @@
}
for (const auto& face : m_faceTable) {
- if (doesMatchFilter(faceFilter, face)) {
- context.append(face->getFaceStatus().wireEncode());
+ if (!doesMatchFilter(faceFilter, face)) {
+ continue;
}
+ ndn::nfd::FaceStatus status;
+ collectFaceProperties(*face, status);
+ collectFaceCounters(*face, status);
+ context.append(status.wireEncode());
}
context.end();
@@ -362,13 +369,60 @@
return true;
}
+template<typename FaceTraits>
+inline void
+collectLpFaceProperties(const face::LpFace& face, FaceTraits& traits)
+{
+ traits.setFaceId(face.getId())
+ .setRemoteUri(face.getRemoteUri().toString())
+ .setLocalUri(face.getLocalUri().toString())
+ .setFaceScope(face.getScope())
+ .setFacePersistency(face.getPersistency())
+ .setLinkType(face.getLinkType());
+ // TODO#3172 replace this into FaceManager::collectFaceProperties
+}
+
+template<typename FaceTraits>
+void
+FaceManager::collectFaceProperties(const Face& face, FaceTraits& traits)
+{
+ auto lpFace = dynamic_cast<const face::LpFace*>(&face);
+ if (lpFace != nullptr) {
+ collectLpFaceProperties(*lpFace, traits);
+ return;
+ }
+
+ traits.setFaceId(face.getId())
+ .setRemoteUri(face.getRemoteUri().toString())
+ .setLocalUri(face.getLocalUri().toString())
+ .setFaceScope(face.isLocal() ? ndn::nfd::FACE_SCOPE_LOCAL
+ : ndn::nfd::FACE_SCOPE_NON_LOCAL)
+ .setFacePersistency(face.getPersistency())
+ .setLinkType(face.isMultiAccess() ? ndn::nfd::LINK_TYPE_MULTI_ACCESS
+ : ndn::nfd::LINK_TYPE_POINT_TO_POINT);
+}
+
+void
+FaceManager::collectFaceCounters(const Face& face, ndn::nfd::FaceStatus& status)
+{
+ const face::FaceCounters& counters = face.getCounters();
+ status.setNInInterests(counters.nInInterests)
+ .setNOutInterests(counters.nOutInterests)
+ .setNInDatas(counters.nInData)
+ .setNOutDatas(counters.nOutData)
+ .setNInNacks(counters.nInNacks)
+ .setNOutNacks(counters.nOutNacks)
+ .setNInBytes(counters.nInBytes)
+ .setNOutBytes(counters.nOutBytes);
+}
+
void
FaceManager::afterFaceAdded(shared_ptr<Face> face,
const ndn::mgmt::PostNotification& post)
{
ndn::nfd::FaceEventNotification notification;
notification.setKind(ndn::nfd::FACE_EVENT_CREATED);
- face->copyStatusTo(notification);
+ collectFaceProperties(*face, notification);
post(notification.wireEncode());
}
@@ -379,7 +433,7 @@
{
ndn::nfd::FaceEventNotification notification;
notification.setKind(ndn::nfd::FACE_EVENT_DESTROYED);
- face->copyStatusTo(notification);
+ collectFaceProperties(*face, notification);
post(notification.wireEncode());
}
diff --git a/daemon/mgmt/face-manager.hpp b/daemon/mgmt/face-manager.hpp
index 57788b7..da217b2 100644
--- a/daemon/mgmt/face-manager.hpp
+++ b/daemon/mgmt/face-manager.hpp
@@ -118,6 +118,18 @@
bool
doesMatchFilter(const ndn::nfd::FaceQueryFilter& filter, shared_ptr<Face> face);
+ /** \brief copy face properties into traits
+ * \tparam FaceTraits either FaceStatus or FaceEventNotification
+ */
+ template<typename FaceTraits>
+ static void
+ collectFaceProperties(const Face& face, FaceTraits& traits);
+
+ /** \brief copy face counters into FaceStatus
+ */
+ static void
+ collectFaceCounters(const Face& face, ndn::nfd::FaceStatus& status);
+
private: // NotificationStream
void
afterFaceAdded(shared_ptr<Face> face,
diff --git a/daemon/mgmt/forwarder-status-manager.cpp b/daemon/mgmt/forwarder-status-manager.cpp
index bf2372b..b614a58 100644
--- a/daemon/mgmt/forwarder-status-manager.cpp
+++ b/daemon/mgmt/forwarder-status-manager.cpp
@@ -56,7 +56,13 @@
status.setNMeasurementsEntries(m_forwarder.getMeasurements().size());
status.setNCsEntries(m_forwarder.getCs().size());
- m_forwarder.getCounters().copyTo(status);
+ const ForwarderCounters& counters = m_forwarder.getCounters();
+ status.setNInInterests(counters.nInInterests)
+ .setNOutInterests(counters.nOutInterests)
+ .setNInDatas(counters.nInData)
+ .setNOutDatas(counters.nOutData)
+ .setNInNacks(counters.nInNacks)
+ .setNOutNacks(counters.nOutNacks);
context.setExpiry(STATUS_SERVER_DEFAULT_FRESHNESS);