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()); } } }