30 #include <ndn-cxx/util/random.hpp>
37 : m_probingInterval(DEFAULT_PROBING_INTERVAL)
38 , m_measurements(measurements)
50 if (info ==
nullptr) {
64 FaceInfoFacePairSet rankedFaces;
69 Face& hopFace = hop.getFace();
85 rankedFaces.insert({info, &hopFace});
88 if (rankedFaces.empty()) {
93 return chooseFace(rankedFaces);
105 static std::uniform_int_distribution<> randDist(0, 5000);
106 auto interval = randDist(ndn::random::getRandomNumberEngine());
126 ProbingModule::chooseFace(
const FaceInfoFacePairSet& rankedFaces)
128 static std::uniform_real_distribution<> randDist;
129 double randomNumber = randDist(ndn::random::getRandomNumberEngine());
130 uint64_t rankSum = (rankedFaces.size() + 1) * rankedFaces.size() / 2;
135 for (
const auto& pair : rankedFaces) {
136 double probability = getProbingProbability(rank++, rankSum, rankedFaces.size());
147 if (randomNumber <= offset + probability) {
151 offset += probability;
159 ProbingModule::getProbingProbability(uint64_t rank, uint64_t rankSum, uint64_t nFaces)
164 return static_cast<double>(nFaces + 1 - rank) / rankSum;
171 m_probingInterval = probingInterval;
174 NDN_THROW(std::invalid_argument(
"Probing interval must be >= " +
This file contains common algorithms used by forwarding strategies.
Generalization of a network interface.
FaceId getId() const noexcept
Returns the face ID.
Represents an entry in the FIB.
const NextHopList & getNextHops() const
const Name & getPrefix() const
Helper class to retrieve and create strategy measurements.
NamespaceInfo & getOrCreateNamespaceInfo(const fib::Entry &fibEntry, const Name &prefix)
static constexpr time::microseconds MEASUREMENTS_LIFETIME
FaceInfo * getFaceInfo(const fib::Entry &fibEntry, const Name &interestName, FaceId faceId)
NamespaceInfo * getNamespaceInfo(const Name &prefix)
Strategy information for each face in a namespace.
static constexpr time::nanoseconds RTT_NO_MEASUREMENT
time::nanoseconds getLastRtt() const
Stores strategy information about each face in this namespace.
void setIsFirstProbeScheduled(bool isScheduled)
bool isFirstProbeScheduled() const
void setIsProbingDue(bool isProbingDue)
bool isProbingDue() const
Face * getFaceToProbe(const Face &inFace, const Interest &interest, const fib::Entry &fibEntry, const Face &faceUsed)
bool isProbingNeeded(const fib::Entry &fibEntry, const Name &interestName)
static constexpr time::milliseconds MIN_PROBING_INTERVAL
void afterForwardingProbe(const fib::Entry &fibEntry, const Name &interestName)
void setProbingInterval(time::milliseconds probingInterval)
void scheduleProbe(const fib::Entry &fibEntry, time::milliseconds interval)
ProbingModule(AsfMeasurements &measurements)
static constexpr time::milliseconds DEFAULT_PROBING_INTERVAL
bool wouldViolateScope(const Face &inFace, const Interest &interest, const Face &outFace)
Determine whether forwarding the Interest in pitEntry to outFace would violate scope.
Scheduler & getScheduler()
Returns the global Scheduler instance for the calling thread.