30 #include <boost/random/uniform_real_distribution.hpp>
39 "ProbingModule::DEFAULT_PROBING_INTERVAL must be less than AsfMeasurements::MEASUREMENTS_LIFETIME");
42 : m_probingInterval(DEFAULT_PROBING_INTERVAL)
43 , m_measurements(measurements)
56 if (info ==
nullptr) {
69 const Interest& interest,
73 FaceInfoFacePairSet rankedFaces(
74 [] (FaceInfoFacePair pairLhs, FaceInfoFacePair pairRhs) ->
bool {
87 Face& hopFace = hop.getFace();
91 if (hopFace.getId() == inFace.getId() || hopFace.getId() == faceUsed.getId()) {
103 rankedFaces.insert(std::make_pair(info, &hopFace));
106 if (rankedFaces.empty()) {
111 return getFaceBasedOnProbability(rankedFaces);
123 uint64_t interval = getRandomNumber(0, 5000);
144 ProbingModule::getFaceBasedOnProbability(
const FaceInfoFacePairSet& rankedFaces)
146 double randomNumber = getRandomNumber(0, 1);
147 uint64_t rankSum = ((rankedFaces.size() + 1) * rankedFaces.size()) / 2;
152 for (
const FaceInfoFacePair pair : rankedFaces) {
153 double probability = getProbingProbability(rank++, rankSum, rankedFaces.size());
164 if (randomNumber <= offset + probability) {
169 offset += probability;
178 ProbingModule::getProbingProbability(uint64_t rank, uint64_t rankSum, uint64_t nFaces)
183 return static_cast<double>(nFaces + 1 - rank) / rankSum;
187 ProbingModule::getRandomNumber(
double start,
double end)
189 boost::random::uniform_real_distribution<double> distribution(start, end);
void scheduleProbe(const fib::Entry &fibEntry, const time::milliseconds &interval)
void afterForwardingProbe(const fib::Entry &fibEntry, const Interest &interest)
bool hasSrttMeasurement() const
ProbingModule(AsfMeasurements &measurements)
NamespaceInfo * getNamespaceInfo(const Name &prefix)
RttStats::Rtt getSrtt() const
void setIsProbingDue(bool isProbingDue)
FaceInfo * getFaceInfo(const fib::Entry &fibEntry, const Interest &interest, const Face &face)
const Name & getPrefix() const
static constexpr time::microseconds MEASUREMENTS_LIFETIME
Copyright (c) 2014-2015, Regents of the University of California, Arizona Board of Regents...
static constexpr time::seconds DEFAULT_PROBING_INTERVAL
NamespaceInfo & getOrCreateNamespaceInfo(const fib::Entry &fibEntry, const Interest &interest)
void setHasFirstProbeBeenScheduled(bool hasBeenScheduled)
bool isProbingNeeded(const fib::Entry &fibEntry, const Interest &interest)
boost::random::mt19937 & getGlobalRng()
stores stategy information about each face in this namespace
EventId schedule(const time::nanoseconds &after, const Scheduler::Event &event)
schedule an event
bool isFirstProbeScheduled() const
Face * getFaceToProbe(const Face &inFace, const Interest &interest, const fib::Entry &fibEntry, const Face &faceUsed)
represents a nexthop record in FIB entry
const NextHopList & getNextHops() const
Strategy information for each face in a namespace.
Helper class to retrieve and create strategy measurements.
bool isProbingDue() const