time::steady_clock::TimePoint RetxSuppression::getLastOutgoing(const pit::Entry& pitEntry) const { const pit::OutRecordCollection& outRecords = pitEntry.getOutRecords(); pit::OutRecordCollection::const_iterator lastOutgoing = std::max_element( outRecords.begin(), outRecords.end(), [] (const pit::OutRecord& a, const pit::OutRecord& b) { return a.getLastRenewed() < b.getLastRenewed(); }); BOOST_ASSERT(lastOutgoing != outRecords.end()); // otherwise it's new PIT entry return lastOutgoing->getLastRenewed(); }
RetxSuppressionResult RetxSuppressionExponential::decidePerUpstream(pit::Entry& pitEntry, Face& outFace) { // NEW if outRecord for the face does not exist auto outRecord = pitEntry.getOutRecord(outFace); if (outRecord == pitEntry.out_end()) { return RetxSuppressionResult::NEW; } auto lastOutgoing = outRecord->getLastRenewed(); auto now = time::steady_clock::now(); auto sinceLastOutgoing = now - lastOutgoing; // insertStrategyInfo does not insert m_initialInterval again if it already exists PitInfo* pi = outRecord->insertStrategyInfo<PitInfo>(m_initialInterval).first; bool shouldSuppress = sinceLastOutgoing < pi->suppressionInterval; if (shouldSuppress) { return RetxSuppressionResult::SUPPRESS; } return RetxSuppressionResult::FORWARD; }
void Forwarder::insertDeadNonceList(pit::Entry& pitEntry, bool isSatisfied, const time::milliseconds& dataFreshnessPeriod, Face* upstream) { // need Dead Nonce List insert? bool needDnl = false; if (isSatisfied) { bool hasFreshnessPeriod = dataFreshnessPeriod >= time::milliseconds::zero(); // Data never becomes stale if it doesn't have FreshnessPeriod field needDnl = static_cast<bool>(pitEntry.getInterest().getMustBeFresh()) && (hasFreshnessPeriod && dataFreshnessPeriod < m_deadNonceList.getLifetime()); } else { needDnl = true; } if (!needDnl) { return; } // Dead Nonce List insert if (upstream == 0) { // insert all outgoing Nonces const pit::OutRecordCollection& outRecords = pitEntry.getOutRecords(); std::for_each(outRecords.begin(), outRecords.end(), bind(&insertNonceToDnl, ref(m_deadNonceList), cref(pitEntry), _1)); } else { // insert outgoing Nonce of a specific face pit::OutRecordCollection::const_iterator outRecord = pitEntry.getOutRecord(*upstream); if (outRecord != pitEntry.getOutRecords().end()) { m_deadNonceList.add(pitEntry.getName(), outRecord->getLastNonce()); } } }
static inline void insertNonceToDnl(DeadNonceList& dnl, const pit::Entry& pitEntry, const pit::OutRecord& outRecord) { dnl.add(pitEntry.getName(), outRecord.getLastNonce()); }