46 : m_forwarder(forwarder)
47 , m_nameTree(m_forwarder.getNameTree())
54 auto entry = make_unique<Entry>(Name());
56 NFD_LOG_INFO(
"setDefaultStrategy " << entry->getStrategyInstanceName());
69 return InsertResult::DEPTH_EXCEEDED;
72 unique_ptr<Strategy> strategy;
76 catch (
const std::invalid_argument& e) {
77 NFD_LOG_ERROR(
"insert(" << prefix <<
"," << strategyName <<
") cannot create strategy: " << e.what());
81 if (strategy ==
nullptr) {
82 NFD_LOG_ERROR(
"insert(" << prefix <<
"," << strategyName <<
") strategy not registered");
83 return InsertResult::NOT_REGISTERED;
89 if (entry !=
nullptr) {
91 NFD_LOG_TRACE(
"insert(" << prefix <<
") not changing " << strategy->getInstanceName());
92 return InsertResult::OK;
96 " to " << strategy->getInstanceName());
100 auto newEntry = make_unique<Entry>(prefix);
101 entry = newEntry.get();
104 NFD_LOG_TRACE(
"insert(" << prefix <<
") new entry " << strategy->getInstanceName());
107 this->changeStrategy(*entry, *oldStrategy, *strategy);
109 return InsertResult::OK;
112 StrategyChoice::InsertResult::InsertResult(Status status,
const std::string& exceptionMessage)
114 , m_exceptionMessage(exceptionMessage)
121 switch (res.m_status) {
122 case StrategyChoice::InsertResult::OK:
124 case StrategyChoice::InsertResult::NOT_REGISTERED:
125 return os <<
"Strategy not registered";
126 case StrategyChoice::InsertResult::EXCEPTION:
127 return os <<
"Error instantiating strategy: " << res.m_exceptionMessage;
128 case StrategyChoice::InsertResult::DEPTH_EXCEEDED:
129 return os <<
"Prefix has too many components (limit is "
138 BOOST_ASSERT(prefix.size() > 0);
141 if (nte ==
nullptr) {
146 if (entry ==
nullptr) {
153 this->changeStrategy(*entry, oldStrategy, parentStrategy);
160 std::pair<bool, Name>
164 if (nte ==
nullptr) {
169 if (entry ==
nullptr) {
178 StrategyChoice::findEffectiveStrategyImpl(
const K& key)
const
181 BOOST_ASSERT(nte !=
nullptr);
188 return this->findEffectiveStrategyImpl(prefix);
194 return this->findEffectiveStrategyImpl(pitEntry);
200 return this->findEffectiveStrategyImpl(measurementsEntry);
209 pitEntry->clearStrategyInfo();
210 for (
const auto& inRecord : pitEntry->getInRecords()) {
213 for (
const auto& outRecord : pitEntry->getOutRecords()) {
223 StrategyChoice::changeStrategy(Entry& entry, Strategy& oldStrategy, Strategy& newStrategy)
225 const Name& oldInstanceName = oldStrategy.getInstanceName();
226 const Name& newInstanceName = newStrategy.getInstanceName();
229 NFD_LOG_INFO(
"changeStrategy(" << entry.getPrefix() <<
") "
230 << oldInstanceName <<
" -> " << newInstanceName <<
" same-type");
234 NFD_LOG_INFO(
"changeStrategy(" << entry.getPrefix() <<
") "
235 << oldInstanceName <<
" -> " << newInstanceName);
239 const name_tree::Entry* rootNte = m_nameTree.
getEntry(entry);
240 BOOST_ASSERT(rootNte !=
nullptr);
242 [&rootNte] (
const name_tree::Entry& nte) -> std::pair<bool, bool> {
243 if (&nte == rootNte) {
246 if (nte.getStrategyChoiceEntry() !=
nullptr) {
247 return {false, false};
251 for (
const auto& nte : ntChanged) {
257 StrategyChoice::getRange()
const
260 boost::adaptors::transformed(name_tree::GetTableEntry<Entry>(
Main class of NFD's forwarding engine.
void clearStrategyInfo()
Clear all StrategyInfo items.
Base class of all forwarding strategies.
const Name & getInstanceName() const noexcept
Returns the strategy's instance name.
static unique_ptr< Strategy > create(const Name &instanceName, Forwarder &forwarder)
Returns a strategy instance created from instanceName.
static bool areSameType(const Name &instanceNameA, const Name &instanceNameB)
Returns whether two names will instantiate the same strategy type.
Represents an entry in the Measurements table.
An entry in the name tree.
measurements::Entry * getMeasurementsEntry() const
const std::vector< shared_ptr< pit::Entry > > & getPitEntries() const
void setStrategyChoiceEntry(unique_ptr< strategy_choice::Entry > strategyChoiceEntry)
const Name & getName() const noexcept
strategy_choice::Entry * getStrategyChoiceEntry() const
Range partialEnumerate(const Name &prefix, const EntrySubTreeSelector &entrySubTreeSelector=AnyEntrySubTree()) const
Enumerate all entries under a prefix.
size_t eraseIfEmpty(Entry *entry, bool canEraseAncestors=true)
Delete the entry if it is empty.
Range fullEnumerate(const EntrySelector &entrySelector=AnyEntry()) const
Enumerate all entries.
static constexpr size_t getMaxDepth()
Maximum depth of the name tree.
Entry & lookup(const Name &name, size_t prefixLen)
Find or insert an entry by name.
Entry * getEntry(const EntryT &tableEntry) const
Entry * findExactMatch(const Name &name, size_t prefixLen=std::numeric_limits< size_t >::max()) const
Exact match lookup.
Entry * findLongestPrefixMatch(const Name &name, const EntrySelector &entrySelector=AnyEntry()) const
Longest prefix matching.
Represents an entry in the Interest table (PIT).
Contains information about an Interest from an incoming face.
Contains information about an Interest toward an outgoing face.
Represents an entry in the Strategy Choice table.
const Name & getStrategyInstanceName() const
fw::Strategy & getStrategy() const
void setStrategy(unique_ptr< fw::Strategy > strategy)
void erase(const Name &prefix)
Make prefix to inherit strategy from its parent.
StrategyChoice(Forwarder &forwarder)
boost::transformed_range< name_tree::GetTableEntry< Entry >, const name_tree::Range > Range
InsertResult insert(const Name &prefix, const Name &strategyName)
Set strategy of prefix to be strategyName.
void setDefaultStrategy(const Name &strategyName)
Set the default strategy.
fw::Strategy & findEffectiveStrategy(const Name &prefix) const
Get effective strategy for prefix.
std::pair< bool, Name > get(const Name &prefix) const
Get strategy Name of prefix.
#define NFD_LOG_INIT(name)
static void clearStrategyInfo(const name_tree::Entry &nte)
static bool nteHasStrategyChoiceEntry(const name_tree::Entry &nte)
std::ostream & operator<<(std::ostream &os, const StrategyChoice::InsertResult &res)