mgmt: re-added expiration time to FaceStatus

refs #3381

Change-Id: I57d3166fc6ed52a54c442a80faffe7a7f4051e1d
diff --git a/daemon/face/face.hpp b/daemon/face/face.hpp
index d783dd0..2b56fec 100644
--- a/daemon/face/face.hpp
+++ b/daemon/face/face.hpp
@@ -159,6 +159,12 @@
    */
   signal::Signal<Transport, FaceState/*old*/, FaceState/*new*/>& afterStateChange;
 
+  /** \return expiration time of the face
+   *  \retval time::steady_clock::TimePoint::max() the face has an indefinite lifetime
+   */
+  time::steady_clock::TimePoint
+  getExpirationTime() const;
+
   /** \brief request the face to be closed
    *
    *  This operation is effective only if face is in UP or DOWN state,
@@ -266,6 +272,12 @@
   return m_transport->getState();
 }
 
+inline time::steady_clock::TimePoint
+Face::getExpirationTime() const
+{
+  return m_transport->getExpirationTime();
+}
+
 inline void
 Face::close()
 {
diff --git a/daemon/face/transport.cpp b/daemon/face/transport.cpp
index 2d2c3dd..26cc0d7 100644
--- a/daemon/face/transport.cpp
+++ b/daemon/face/transport.cpp
@@ -64,6 +64,7 @@
   , m_linkType(ndn::nfd::LINK_TYPE_NONE)
   , m_mtu(MTU_INVALID)
   , m_state(TransportState::UP)
+  , m_expirationTime(time::steady_clock::TimePoint::max())
 {
 }
 
diff --git a/daemon/face/transport.hpp b/daemon/face/transport.hpp
index 56ff730..a12ce7c 100644
--- a/daemon/face/transport.hpp
+++ b/daemon/face/transport.hpp
@@ -253,6 +253,12 @@
    */
   signal::Signal<Transport, TransportState/*old*/, TransportState/*new*/> afterStateChange;
 
+  /** \return expiration time of the transport
+   *  \retval time::steady_clock::TimePoint::max() the transport has indefinite lifetime
+   */
+  time::steady_clock::TimePoint
+  getExpirationTime() const;
+
 protected: // properties to be set by subclass
   void
   setLocalUri(const FaceUri& uri);
@@ -279,6 +285,9 @@
   void
   setState(TransportState newState);
 
+  void
+  setExpirationTime(const time::steady_clock::TimePoint& expirationTime);
+
 protected: // to be overridden by subclass
   /** \brief invoked before persistency is changed
    *  \throw std::invalid_argument new persistency is not supported
@@ -316,6 +325,7 @@
   ndn::nfd::LinkType m_linkType;
   ssize_t m_mtu;
   TransportState m_state;
+  time::steady_clock::TimePoint m_expirationTime;
 };
 
 inline const Face*
@@ -415,6 +425,18 @@
   return m_state;
 }
 
+inline time::steady_clock::TimePoint
+Transport::getExpirationTime() const
+{
+  return m_expirationTime;
+}
+
+inline void
+Transport::setExpirationTime(const time::steady_clock::TimePoint& expirationTime)
+{
+  m_expirationTime = expirationTime;
+}
+
 std::ostream&
 operator<<(std::ostream& os, const FaceLogHelper<Transport>& flh);
 
diff --git a/daemon/face/unicast-udp-transport.cpp b/daemon/face/unicast-udp-transport.cpp
index 3bd4759..b6ad19a 100644
--- a/daemon/face/unicast-udp-transport.cpp
+++ b/daemon/face/unicast-udp-transport.cpp
@@ -89,6 +89,7 @@
   }
   else {
     m_closeIfIdleEvent.cancel();
+    setExpirationTime(time::steady_clock::TimePoint::max());
   }
 }
 
@@ -105,6 +106,7 @@
       scheduleClosureWhenIdle();
     }
   });
+  setExpirationTime(time::steady_clock::now() + m_idleTimeout);
 }
 
 } // namespace face