31   , m_index(m_container.
get<0>())
    32   , m_queue(m_container.
get<1>())
    34   if (inner == 
nullptr) {
    35     NDN_THROW(std::invalid_argument(
"inner policy is missing"));
    55   uint64_t timestamp = 0;
    56   std::tie(isOk, keyName, timestamp) = parseCommandInterest(interest, state);
    61   if (!checkTimestamp(state, keyName, timestamp)) {
    68 ValidationPolicyCommandInterest::cleanup()
    72   while ((!m_queue.empty() && m_queue.front().lastRefreshed <= expiring) ||
    74           m_queue.size() > 
static_cast<size_t>(m_options.
maxRecords))) {
    79 std::tuple<bool, Name, uint64_t>
    80 ValidationPolicyCommandInterest::parseCommandInterest(
const Interest& interest,
    81                                                       const shared_ptr<ValidationState>& state)
 const    87     return std::make_tuple(
false, 
Name(), 0);
    93                  interest.
getName().
toUri() + 
"` doesn't include timestamp component"});
    94     return std::make_tuple(
false, 
Name(), 0);
    98   if (!state->getOutcome()) { 
    99     return std::make_tuple(
false, 
Name(), 0);
   102   return std::make_tuple(
true, klName, timestampComp.
toNumber());
   106 ValidationPolicyCommandInterest::checkTimestamp(
const shared_ptr<ValidationState>& state,
   107                                                 const Name& keyName, uint64_t timestamp)
   113   if (timestampPoint < now - m_options.gracePeriod || timestampPoint > now + m_options.
gracePeriod) {
   115                  "Timestamp is outside the grace period for key " + keyName.
toUri()});
   119   auto it = m_index.find(keyName);
   120   if (it != m_index.end()) {
   121     if (timestamp <= it->timestamp) {
   123                    "Timestamp is reordered for key " + keyName.
toUri()});
   129   BOOST_ASSERT(interestState != 
nullptr);
   130   interestState->afterSuccess.connect([=] (
const Interest&) { insertNewRecord(keyName, timestamp); });
   135 ValidationPolicyCommandInterest::insertNewRecord(
const Name& keyName, uint64_t timestamp)
   139   auto i = m_queue.end();
   141   LastTimestampRecord newRecord{keyName, timestamp, now};
   142   std::tie(i, isNew) = m_queue.push_back(newRecord);
   145     BOOST_ASSERT(i->keyName == keyName);
   149     isNew = m_queue.push_back(newRecord).second;
 void setInnerPolicy(unique_ptr< ValidationPolicy > innerPolicy)
Set inner policy. 
time::nanoseconds gracePeriod
tolerance of initial timestamp 
system_clock::TimePoint fromUnixTimestamp(milliseconds duration)
Convert UNIX timestamp to system_clock::TimePoint. 
static time_point now() noexcept
Represents an Interest packet. 
ValidationPolicy & getInnerPolicy()
Return the inner policy. 
void checkPolicy(const Data &data, const shared_ptr< ValidationState > &state, const ValidationContinuation &continueValidation) override
Check data against the policy. 
static time_point now() noexcept
bool isNumber() const
Check if the component is a nonNegativeInteger. 
const Component & at(ssize_t i) const
Returns an immutable reference to the component at the specified index, with bounds checking...
std::function< void(const shared_ptr< CertificateRequest > &certRequest, const shared_ptr< ValidationState > &state)> ValidationContinuation
static Name getKeyLocatorName(const SignatureInfo &si, ValidationState &state)
Validation state for an interest packet. 
R & get(variant< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15 > &v, nonstd::in_place_t(&)(nonstd::detail::in_place_type_tag< R >)=nonstd::in_place_type< R >)
const size_t MIN_SIZE
minimal number of components for Command Interest 
Represents an absolute name. 
time::nanoseconds recordLifetime
max lifetime of a last timestamp record 
size_t size() const
Returns the number of components. 
uint64_t toNumber() const
Interpret this name component as nonNegativeInteger. 
ssize_t maxRecords
max number of distinct public keys of which to record the last timestamp 
Represents a name component. 
const ssize_t POS_TIMESTAMP
const Name & getName() const noexcept
void toUri(std::ostream &os, name::UriFormat format=name::UriFormat::DEFAULT) const
Write URI representation of the name to the output stream. 
virtual void checkPolicy(const Data &data, const shared_ptr< ValidationState > &state, const ValidationContinuation &continueValidation)=0
Check data against the policy. 
Represents a Data packet. 
ValidationPolicyCommandInterest(unique_ptr< ValidationPolicy > inner, const Options &options={})
constructor