shared_ptr<Entry> Measurements::get(const fib::Entry& fibEntry) { shared_ptr<name_tree::Entry> nte = m_nameTree.get(fibEntry); if (nte == nullptr) { // must be Fib::s_emptyEntry that is unattched BOOST_ASSERT(fibEntry.getPrefix().empty()); nte = m_nameTree.lookup(fibEntry.getPrefix()); } BOOST_ASSERT(nte != nullptr); return this->get(*nte); }
void ProbingModule::scheduleProbe(const fib::Entry& fibEntry, const time::milliseconds& interval) { Name prefix = fibEntry.getPrefix(); // Set the probing flag for the namespace to true after passed interval of time scheduler::schedule(interval, [this, prefix] { NamespaceInfo* info = m_measurements.getNamespaceInfo(prefix); if (info == nullptr) { // fib::Entry with the passed prefix has been removed or the fib::Entry has // a name that is not controlled by the AsfStrategy return; } else { info->setIsProbingDue(true); } }); }
void AsfStrategy::forwardInterest(const Interest& interest, const fib::Entry& fibEntry, const shared_ptr<pit::Entry>& pitEntry, Face& outFace, bool wantNewNonce) { if (wantNewNonce) { //Send probe: interest with new Nonce Interest probeInterest(interest); probeInterest.refreshNonce(); NFD_LOG_TRACE("Sending probe for " << probeInterest << probeInterest.getNonce() << " to FaceId: " << outFace.getId()); this->sendInterest(pitEntry, outFace, probeInterest); } else { this->sendInterest(pitEntry, outFace, interest); } FaceInfo& faceInfo = m_measurements.getOrCreateFaceInfo(fibEntry, interest, outFace); // Refresh measurements since Face is being used for forwarding NamespaceInfo& namespaceInfo = m_measurements.getOrCreateNamespaceInfo(fibEntry, interest); namespaceInfo.extendFaceInfoLifetime(faceInfo, outFace); if (!faceInfo.isTimeoutScheduled()) { // Estimate and schedule timeout RttEstimator::Duration timeout = faceInfo.computeRto(); NFD_LOG_TRACE("Scheduling timeout for " << fibEntry.getPrefix() << " FaceId: " << outFace.getId() << " in " << time::duration_cast<time::milliseconds>(timeout) << " ms"); scheduler::EventId id = scheduler::schedule(timeout, bind(&AsfStrategy::onTimeout, this, interest.getName(), outFace.getId())); faceInfo.setTimeoutEvent(id, interest.getName()); } }