34 : m_forwarder(forwarder)
35 , m_isConfigured(false)
43 processConfig(std::forward<decltype(args)>(args)...);
58 m_isConfigured =
true;
62 TablesConfigSection::processConfig(
const ConfigSection& section,
bool isDryRun,
const std::string&)
66 if (csMaxPacketsNode) {
67 nCsMaxPackets = ConfigFile::parseNumber<size_t>(*csMaxPacketsNode,
"cs_max_packets",
"tables");
70 unique_ptr<cs::Policy> csPolicy;
73 std::string policyName = csPolicyNode->get_value<std::string>();
75 if (csPolicy ==
nullptr) {
76 NDN_THROW(ConfigFile::Error(
"Unknown cs_policy '" + policyName +
"' in section 'tables'"));
80 unique_ptr<fw::UnsolicitedDataPolicy> unsolicitedDataPolicy;
81 OptionalConfigSection unsolicitedDataPolicyNode = section.get_child_optional(
"cs_unsolicited_policy");
82 if (unsolicitedDataPolicyNode) {
83 std::string policyName = unsolicitedDataPolicyNode->get_value<std::string>();
85 if (unsolicitedDataPolicy ==
nullptr) {
86 NDN_THROW(ConfigFile::Error(
"Unknown cs_unsolicited_policy '" + policyName +
"' in section 'tables'"));
90 unsolicitedDataPolicy = make_unique<fw::DefaultUnsolicitedDataPolicy>();
94 if (strategyChoiceSection) {
95 processStrategyChoiceSection(*strategyChoiceSection, isDryRun);
99 if (networkRegionSection) {
100 processNetworkRegionSection(*networkRegionSection, isDryRun);
107 Cs& cs = m_forwarder.
getCs();
109 if (cs.size() == 0 && csPolicy !=
nullptr) {
110 cs.setPolicy(std::move(csPolicy));
115 m_isConfigured =
true;
119 TablesConfigSection::processStrategyChoiceSection(
const ConfigSection& section,
bool isDryRun)
121 std::map<Name, Name> choices;
122 for (
const auto& prefixAndStrategy : section) {
123 Name prefix(prefixAndStrategy.first);
124 Name strategy(prefixAndStrategy.second.get_value<std::string>());
127 NDN_THROW(ConfigFile::Error(
"Unknown strategy '" + prefixAndStrategy.second.get_value<std::string>() +
128 "' for prefix '" + prefix.toUri() +
"' in section 'strategy_choice'"));
131 if (!choices.try_emplace(prefix, std::move(strategy)).second) {
132 NDN_THROW(ConfigFile::Error(
"Duplicate strategy choice for prefix '" + prefix.toUri() +
133 "' in section 'strategy_choice'"));
142 for (
const auto& prefixAndStrategy : choices) {
143 if (!sc.insert(prefixAndStrategy.first, prefixAndStrategy.second)) {
144 NDN_THROW(ConfigFile::Error(
145 "Failed to set strategy '" + prefixAndStrategy.second.toUri() +
"' for prefix '" +
146 prefixAndStrategy.first.toUri() +
"' in section 'strategy_choice'"));
153 TablesConfigSection::processNetworkRegionSection(
const ConfigSection& section,
bool isDryRun)
161 for (
const auto& pair : section) {
162 nrt.insert(Name(pair.first));
Configuration file parsing utility.
void addSectionHandler(const std::string §ionName, ConfigSectionHandler subscriber)
Setup notification of configuration file sections.
Main class of NFD's forwarding engine.
NetworkRegionTable & getNetworkRegionTable() noexcept
void setUnsolicitedDataPolicy(unique_ptr< fw::UnsolicitedDataPolicy > policy) noexcept
StrategyChoice & getStrategyChoice() noexcept
void setConfigFile(ConfigFile &configFile)
TablesConfigSection(Forwarder &forwarder)
void ensureConfigured()
Apply default configuration, if tables section was omitted in configuration file.
void setLimit(size_t nMaxPackets)
Change capacity (in number of packets).
static unique_ptr< Policy > create(const std::string &policyName)
Returns a cs::Policy identified by policyName, or nullptr if policyName is unknown.
static bool canCreate(const Name &instanceName)
Returns whether a strategy instance can be created from instanceName.
static unique_ptr< UnsolicitedDataPolicy > create(const std::string &policyName)
boost::optional< const ConfigSection & > OptionalConfigSection
An optional configuration file section.
boost::property_tree::ptree ConfigSection
A configuration file section.
constexpr size_t DEFAULT_CS_MAX_PACKETS